师兄您好,我已经看完了 Zuul
的使用,但是还是没明白统一异常该如何处理。
我目前遇到的情况是这样的,同样根据 订单服务
、商品服务
来举例,在这两个服务中,都有 ResultVO
,以及当前服务 ExceptionHandler
。
package com.vito.product.vo
/**
* Created by VitoYi on 2018/9/11.
*/
class ResultVO<T> private constructor(
val code: Int?, //错误码
val msg: String, //提示信息
val data: T?
) {
companion object {
fun <T> success(data: T): ResultVO<T> {
return ResultVO(0, "success", data)
}
fun <T> error(code: Int?, msg: String): ResultVO<T> {
return ResultVO(code, msg, null)
}
}
}
package com.vito.order.exception
import com.vito.order.vo.ResultVO
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody
/**
* Created by VitoYi on 2018/9/11.
*/
@ControllerAdvice
class ExceptionHandle {
val log = LoggerFactory.getLogger(this.javaClass)
@ExceptionHandler(value = [(Exception::class)])
@ResponseBody
fun handler(e: Exception): ResultVO<Any> {
return when(e){
is CreateOrderException -> ResultVO.error(e.code, e.message!!)
else -> {
log.error("【系统异常】{}", e)
ResultVO.error(-1, e.message!!)
}
}
}
}
比如当有一个下单的请求进来时,请求路径是这样的:Zuul -> 订单服务 -> 商品服务
经过测试发现,如果在 订单服务
中抛出异常,是可以处理并返回封装结果的:
但是如果在 商品服务
中抛出异常的话:
这是个什么意思呢?
也就是说, Zuul -> A -> B, 如果异常是在 A
这里抛出来的,是没问题的,但如果异常是在 B
这里抛出,那么在 A
这里就要挂了。
对了,我在您的 5-7 扣库存 这一课中,看到您也是在 商品服务
中做了库存的判断,如果库存不足,则抛出异常。
求师兄指教,该如何操作。
SpringCloud组件实现微服务,【已升级Finchley.Release】
了解课程