控制器外部的Spring异常处理程序

时间:2015-05-02 08:11:30

标签: java spring spring-security

@ControllerAdvice类中我有一个@ExceptionHandler,这个处理程序适用于控制器错误,但如果我有一个过滤器,他们就无法处理异常。我该如何处理这些例外?

过滤器是: -

public class AuthFilter extends UsernamePasswordAuthenticationFilter {

    private LoginDTO loginDTO;

    public AuthFilter() {
        setRequiresAuthenticationRequestMatcher(
                new AntPathRequestMatcher("/login", "POST"));
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request,
            HttpServletResponse response) throws AuthenticationException {

        try {
            loginDTO = new ObjectMapper().readValue(request.getReader(), LoginDTO.class);
        } catch (Exception e) {
            throw new APIException(ExceptionMessages.INVALID_LOGIN_JSON,
                    HttpStatus.BAD_REQUEST);
        }

        return super.attemptAuthentication(request, response);
    }

    ...
}

异常处理程序是(在@ControllerAdvice中)

    @ExceptionHandler(APIException.class)
    public ResponseEntity<ErrorDTO> handleAPIException(APIException e) {
        return new ResponseEntity<ErrorDTO>(new ErrorDTO(e.getMessage()),
                e.getHttpStatus());
    }

更新

我的要求是为spring安全过滤器设置一个全局异常处理程序。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

我怕你不能。以下是(广义上)如何在Spring MVC Web应用程序中处理à请求:

servlet container
    filters before FilterChain.doFilter
        DispatcherServlet  => here is all Spring MVC machinery
    filters after FilterChain.doFilter
servlet container

所有Spring MVC机制都在DispatcherServlet内部进行管理,包括所有异常处理。

恕我直言,你可以尝试两件事:

  • 用拦截器(*)
  • 替换过滤器
  • 在抛出异常的那个之前使用另一个过滤器并在那里捕获它(非Spring MVC方式,但过滤器 在Spring MVC之外)

(*)您仍然无法使用ExceptionHandler,因为异常将被抛出控制器之外,但您可以使用HandlerExceptionResolver。