Hystrix - как зарегистрировать ExceptionMapper
Мой Hystrix/Feign
приложение делает звонки на другие веб-сервисы.
Я хотел бы распространять коды ошибок / сообщения от этих веб-сервисов.
Я реализовал ErrorDecoder
, который правильно декодирует возвращаемые исключения и перебрасывает их.
К сожалению, эти исключения обернуты HystrixRuntimeException
и JSON
возвращается не то, что я хочу (общее сообщение об ошибке, всегда 500 http статус).
Скорее всего мне нужен ExceptionMapper
Я создал один такой:
@Provider
public class GlobalExceptionHandler implements
ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable e) {
System.out.println("ABCD 1");
if(e instanceof HystrixRuntimeException){
System.out.println("ABCD 2");
if(e.getCause() != null && e.getCause() instanceof HttpStatusCodeException)
{
System.out.println("ABCD 3");
HttpStatusCodeException exc = (HttpStatusCodeException)e.getCause();
return Response.status(exc.getStatusCode().value())
.entity(exc.getMessage())
.type(MediaType.APPLICATION_JSON).build();
}
}
return Response.status(500).entity("Internal server error").build();
}
}
К сожалению, этот код не воспринимается моим приложением (операторы отладки не видны в журналах).
Как я могу зарегистрировать его в своем приложении?
1 ответ
Решение
Я не мог использовать ExceptionMapper
,
Я решил эту проблему, используя ResponseEntityExceptionHandler
,
Вот код:
@EnableWebMvc
@ControllerAdvice
public class ServiceExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(HystrixRuntimeException.class)
@ResponseBody
ResponseEntity<String> handleControllerException(HttpServletRequest req, Throwable ex) {
if(ex instanceof HystrixRuntimeException) {
HttpStatusCodeException exc = (HttpStatusCodeException)ex.getCause();
return new ResponseEntity<>(exc.getResponseBodyAsString(), exc.getStatusCode());
}
return new ResponseEntity<String>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}