2017-01-09 5 views
0

Приложение Hystrix/Feign вызывает звонки в другие веб-службы.Hystrix - как зарегистрироваться ExceptionMapper

Я хотел бы распространять коды ошибок/сообщения из этих веб-сервисов.

Я внедрил ErrorDecoder, который правильно декодирует возвращенные исключения и реконструирует их.

К сожалению, эти Исключения обернуты HystrixRuntimeException, а JSON вернули не то, что я хочу (общее сообщение об ошибке, всегда 500 http status).

Скорее всего мне нужно 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(); 
} 
} 

К сожалению, этот код не является снимаемым моим приложением (отлаживать заявления не видны в журналах).

Как я могу зарегистрировать его в своем приложении?

ответ

0

Я не мог использовать 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); 
    } 
} 
Смежные вопросы