6

我尝试捕获从 FeignClient 连接的另一个微服务收到的异常。我制作了自定义的 ErrorDecoder,并且

public class CustomErrorDecoder implements ErrorDecoder {

    private final Logger log = LoggerFactory.getLogger(getClass());

    private final ErrorDecoder defaultErrorDecoder = new Default();

    @Override
    public Exception decode(String methodKey, Response response) {

        if (response.status() >= 400 && response.status() <= 499) {
            log.info("----------------- "+methodKey+" , "+response.status()+" , "+ response.reason());
            return new RestApiException(99,99,"");
        }
        return defaultErrorDecoder.decode(methodKey, response);
    }
} 

RestApiException 扩展异常的地方。

@ControllerAdvice
public class GlobalControllerAdvice {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(RestApiException.class)
    public ResponseEntity<RestApiException> handleException(RestApiException exception, HttpServletRequest req) {
        log.error("Sending error to client ( "+req.getUserPrincipal().getName()+" ) \"{}\"", exception.getErrMsg());
        return new ResponseEntity<RestApiException>(exception, exception.getStatus());
    }

    @ExceptionHandler(Throwable.class)
    public ResponseEntity<RestApiException> handleException(Throwable throwable, HttpServletRequest req) {
        RestApiException exception=new RestApiException(HttpStatus.INTERNAL_SERVER_ERROR, 100, 100,
                throwable.getMessage());
        return handleException(exception, req);
    }

结果,当我收到 <--- HTTP/1.1 400 Bad Request (5380ms) 时,我收到了默认错误消息

HttpStatus.INTERNAL_SERVER_ERROR, 100, 100, throwable.getMessage());

但不是expexted自定义异常,我尝试在CustomErrorDecoder中设置。

我做错了什么,为什么我不能调用 RetAppiException 并将错误答案返回给休息客户端。

谢谢。

4

2 回答 2

10

您无法使用@ControllerAdvice. 异常处理程序不会捕获由 feign 客户端、错误解码器生成的异常。

一个简单的解决方案是捕捉你的假装调用,然后抛出你想要的异常。

try{
   feignClient.method();
} catch(Exception ex){
  //throw exceptions you want
  throw new YourException();
}

然后你就可以处理它了:

@ControllerAdvice
public class GlobalControllerAdvice {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(YourException.class)
    public ResponseEntity<RestApiException> handleException(RestApiException exception, HttpServletRequest req) {
        //impl
    }

}
于 2016-11-02T12:58:44.817 回答
0

您可以通过捕获HystrixRuntimeException和强制转换getCause()来捕获伪装客户端异常FeignClientException

例子:

@ExceptionHandler
public ResponseEntity<Problem> handleFeignException(HystrixRuntimeException ex, NativeWebRequest request) {
    final FeignException.FeignClientException feignClientException = (FeignException.FeignClientException) ex.getCause();
    return handleException(feignClientException, request);
}

于 2020-08-21T14:11:55.957 回答