Spring Boot - передать объект Exception из ResponseEntityExceptionHandler в HandlerInterceptor? - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над Spring Boot Example и внедрил GlobalExceptionHandler и пытаюсь распечатать все сообщения об ошибках в JSON - это мой собственный метод.

Кроме того, у меня есть ExceptionHandler, там я ловлю все исключения,Но есть ли способ передать объект исключения из ResponseEntityExceptionHandler в HandlerInterceptor?

HandlerInterceptor:

@Slf4j
public class GlobalExceptionHandler implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        ............
        .............
        ..............
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        ServletRequestAttributes attributes = (ServletRequestAttributes) request.getAttribute(REQUEST_ATTRIBUTES);
        ServletRequestAttributes threadAttributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();    
        ............
        .............
        ..............
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        if(ex != null) {
            printJsonReq(request, response);
        }
    }
}

ExceptionHandler:

@ControllerAdvice
@Slf4j
public class ExceptionHandler extends ResponseEntityExceptionHandler{

    @ExceptionHandler({ResponseStatusException.class})
    protected ResponseEntity<Object> handleResStatusException(Exception e, WebRequest request, HttpServletRequest httpRequest) {
        ResponseStatusException be = (ResponseStatusException) e;

        ErrorResource error = ErrorResource.builder().code(AppConst.BAD_REQUEST)
                .message(ExceptionUtils.getDetails(e.getCause())).build();

        return handleExceptionInternal(e, error, getHeaders(), HttpStatus.BAD_REQUEST, request);
    }

    .........
    ..........
    .........
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Вы можете настроить перехватчики, используя WebMvcConfigurerAdapter

17.15.3 Настройка перехватчиков

Вы можете настроить HandlerInterceptors или WebRequestInterceptors для применения ко всем входящимзапросы или ограничены определенными шаблонами пути URL.

Пример регистрации перехватчиков в Java:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
     registry.addInterceptor(new GlobalExceptionHandler());

      }

  }
0 голосов
/ 06 ноября 2019

Вы можете установить его как атрибут запроса в классе ExceptionHandler (если вам это нужно, просто чтобы убедиться, что вы собираетесь печатать журнал, тогда вместо передачи объекта Exception вы можете передать логический параметр, чтобы не загружать ваш объект запроса)

request.setAttribute("exception", e);

И используйте его в вашем HandlerInterceptor как

if(ex != null || request.getAttribute("exception") != null) {
   printJsonReq(request, response);
}
...