Изменение регистрации ошибок в Spring Boot / Netty - PullRequest
0 голосов
/ 13 марта 2019

У меня есть приложение Spring Boot, которое запускает Netty для REST API.

У меня есть WebExceptionHandler для обработки исключений, которые могут возникнуть, и это работает. Он строит соответствующие ответы и отправляет их.

Проблема в том, что она также регистрирует исключение как ошибку. Я хочу изменить это, чтобы вместо этого регистрировать это как информацию (потому что у нас есть отслеживание и оповещения, которые работают по-разному на основе информации или ошибки). Он даже регистрирует ошибки типа 404.

Кажется, что exceptionCaught в ChannelInboundHandler помогло бы, но exceptionCaught устарело. Я не могу найти ничего, что не использует этот метод, и я не могу найти ничего, ссылающегося на то, что (если что-нибудь) заменило его).

Я также пытался использовать @ControllerAdvice или @RestControllerAdvice с @ExceptionHandler, но это никогда не вызывалось.

Как правильно перехватить и обработать запись исключения?


Минимальный пример реализации нашей текущей установки выглядит следующим образом:

@RestController
class MyController {
  @RequestMapping(method = [GET], value = ["endpoint"], produces = [APPLICATION_JSON_VALUE])
  fun myEndpoint(): Mono<MyResponse> = createResponse()
}

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class MyWebExceptionHandler : WebExceptionHandler {
  // This does get called and sends the appropriate response back, but an error is logged somewhere outside of our code.
  override fun handle(exchange: ServerWebExchange, ex: Throwable): Mono<Void> = 
    createErrorResponse();
}

// Tried using both, or just one at a time, no difference.
// It does get created.
@ControllerAdvice
@RestControllerAdvice
class MyExceptionHandler {
  // Never called
  @ExceptionHandler(Exception::class)
  fun handle(ex: Exception) {
    log.error(ex.message)
  }
}

1 Ответ

2 голосов
/ 14 марта 2019

Было бы полезно получить дополнительную информацию о том, как вы реализуете ваш обработчик исключений. Вот простая реализация, которой я следую, чтобы преобразовать исключения и зарегистрировать их.

 @ControllerAdvice 
public class DefaultExceptionHandler extends ResponseEntityExceptionHandler {
    private static final Logger LOG = LoggerFactory.getLogger(DefaultExceptionHandler.class);
    private static String ERROR = "ERROR";

    @ExceptionHandler(Exception.class)
    ResponseEntity<Map<String, Map<String, String>>> exception(Exception e) {
        Map<String,Map<String,String>> map = new HashMap<>(1);
        Map<String,String> m = new HashMap<>(1);
        m.put("message",e.getMessage());
        map.put(ERROR, m);
        LOG.info("some error " + e);
        return new ResponseEntity<>(map, HttpStatus.INTERNAL_SERVER_ERROR);
    }

}

Также не забудьте создать bean-компонент или добавить свой класс ExceptionHandler в конфигурацию Spring.

@Bean
public DefaultExceptionHandler defaultExceptionHandler(){
    return new DefaultExceptionHandler();
}
...