Запрос исключений боба и @ControllerAdvice - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть собственный класс Spring Boot AutoConfiguration, в котором я создаю @RequestScop ed компонент пользовательского класса - Foo. В том же классе AutoConfiguration я создаю компонент моего глобального обработчика исключений - @ControllerAdvice. Все эти классы упакованы как jar и используются в качестве зависимости в моем другом веб-приложении Spring Boot. Всякий раз, когда в методе контроллера возникает исключение, соответствующий обработчик исключений вызывается в моем глобальном обработчике исключений, за исключением случаев, когда в Foo возникает исключение, выдается BeanCreationException, и ни один из глобальных обработчиков исключений не вызывается. Я попытался добавить @Order(Ordered.HIGHEST_PRECEDENCE), как предложено в некоторых ответах SO, но ни один из них не сработал. Можно ли обрабатывать такие исключения bean-объекта в области запросов в глобальном обработчике исключений - a @ControllerAdvice? Очень признателен.

РЕДАКТИРОВАТЬ Это мой AutoConfiguration класс. (Это в другой банке)

@Configuration
@ConditionalOnClass({FooContext.class, MyGlobalExceptionHandler.class})
public class AutoConfiguration {

    // This bean is used in a Controller
    @Order
    @RequestScope
    @Bean
    @ConditionalOnMissingBean(FooContext.class)
    public FooContext fooContext() throws IOException {
        // generateFooContext() throws the exception and Spring wraps it with BeanCreationException.
        return FooContextFactory.generateFooContext(); 
    }

    @Bean
    @ConditionalOnMissingBean
    public MyGlobalExceptionHandler globalExceptionHandler(MyErrorHelper errorHelper) {
        return new MyGlobalExceptionHandler (errorHelper);
    }
}

Это MyGlobalExceptionHandler (Это в другой банке)

@ControllerAdvice
@RefreshScope
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyGlobalExceptionHandler {

    // Never invoked 
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> render(Exception ex) {
        log.error("Exception occurred: ", ex);
        return errorHelper.throwErrorException(DEFAULT_ERROR_CODE, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    /// ... 
}

1 Ответ

0 голосов
/ 28 апреля 2020

Мне удалось решить эту проблему, зарегистрировав AbstractHandlerExceptionResolver

@Component
public class ResponseExceptionResolver extends AbstractHandlerExceptionResolver {

    @SneakyThrows
    @Override
    protected ModelAndView doResolveException(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler,
            Exception ex
    ) {
        return handleException(request, response);
    }

    private ModelAndView handleException(
            HttpServletRequest request,
            HttpServletResponse response
    ) {
        response.setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);

        ErrorResponse errorResponse = ...
        return new ModelAndView(new MappingJackson2JsonView(), this.getErrorResponse(errorResponse));
    }

    private Map<String, String> getErrorResponse(ErrorResponse errorResponse) {
        return new ObjectMapper().convertValue(errorResponse, new TypeReference<Map<String, String>>() {
        });
    }
}
...