Почему в весеннем webflux нет трассировки стека исключений с конфигурацией по умолчанию? - PullRequest
0 голосов
/ 17 декабря 2018

Вопрос

Я собрал сервер, следуя Функциональному программированию Webflux , и добавил следующий код к моему маршрутизатору: route(GET("/test/{Id}"), request -> throw new RuntimeException("123")).

Но когда я звоню /test/{Id}, единственный журнал ошибок в консоли:

TRACE 153036 --- [ctor-http-nio-7] o.s.w.r.function.server.RouterFunctions  : [fc7e809d] Matched org.springframework.web.reactive.function.server.RequestPredicates$$Lambda$827/1369035321@9d8c274
DEBUG 153036 --- [ctor-http-nio-7] org.springframework.web.HttpLogging      : [fc7e809d] Resolved [RuntimeException: 123] for HTTP GET /test/job
TRACE 153036 --- [ctor-http-nio-7] org.springframework.web.HttpLogging      : [fc7e809d] Encoding [{timestamp=Mon Dec 17 15:34:43 CST 2018, path=/test/123, status=500, error=Internal Server Error, message=123}]
TRACE 153036 --- [ctor-http-nio-7] o.s.w.s.adapter.HttpWebHandlerAdapter    : [fc7e809d] Completed 500 INTERNAL_SERVER_ERROR, headers={masked}
TRACE 153036 --- [ctor-http-nio-7] org.springframework.web.HttpLogging      : [fc7e809d] Handling completed

Нет трассировки стека, но почему? Это должно обрабатываться Spring или Netty, а не мой настраиваемый код, верно?Установка logging.level.org.springframework.web: trace не является решением, слишком много журналов.

Вот что я нашел до сих пор, но все еще смущен:

Я проверил, почему Spring MVC имеет трассировку стекапотому что в tomcat есть log.error в try-catch и это подтверждается отладкой.

Тогда я подумал, что у Netty тоже есть эта логика?На самом деле это имеет !Но что меня смущает, так это то, что я не могу приостановить код в этом try-catch с любыми точками останова.

Это означает, что может существовать некоторая Mono.onErrorResume, поглощающая исключение, поэтому netty не может ничего поймать.Но я не знаю, как отладить большой Mono для проверки первопричины.И зачем его глотать?

1 Ответ

0 голосов
/ 26 декабря 2018

Опция 1A: Установите свойства приложения следующим образом:

server.error.includeStacktrace=ALWAYS

Опция 1B: Установите свойства приложения следующим образом:

server.error.includeStacktrace=ON_TRACE_PARAM

И , укажите параметр запросаtrace до true.

Вариант 2: Добавьте настроенный WebExceptionHandler и убедитесь, что он находится в области сканирования компонента.

@Component
@Order(-2)
public class LoggingErrorWebExceptionHandler extends DefaultErrorWebExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(LoggingErrorWebExceptionHandler.class);

    public LoggingErrorWebExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties,
            ServerProperties serverProperties, ApplicationContext applicationContext, ServerCodecConfigurer serverCodecConfigurer) {
        super(errorAttributes, resourceProperties, serverProperties.getError(), applicationContext);
        super.setMessageWriters(serverCodecConfigurer.getWriters());
        super.setMessageReaders(serverCodecConfigurer.getReaders());
    }

    @Override
    protected void logError(ServerRequest request, HttpStatus errorStatus) {
        Throwable ex = getError(request);
        logger.error("Error Occurred:", ex);
        super.logError(request, errorStatus);
    }

}

Подробнее см. https://www.baeldung.com/spring-webflux-errorsподробности.

...