Spring引导@ExceptionHandler没有捕获相关的异常

时间:2016-08-10 13:10:09

标签: java spring spring-mvc

我正在使用Spring Boot构建API。我已经设置了一个身份验证过滤器来从请求标头中获取令牌并对其进行身份验证。如果使用令牌找不到用户,则抛出InvalidWSUserException。

我创建了一个包含许多@ExceptionHandlers的类,以便我可以捕获InvalidWSUserException并使用JSON字符串进行响应,通知请求客户端请求中的令牌无效。

我已经开始研究另一个项目,但我似乎无法在这个新项目中使用它。

InvalidWSUserException为空,因为Handler应该处理响应;

public class InvalidWSUserException extends RuntimeException {
}

我已经将处理程序类定义为;

@ControllerAdvice
public class ExceptionController {

    @ExceptionHandler(value=InvalidWSUserException.class)
    public ResponseEntity invalidWSUserException(InvalidWSUserException exception) {
        return new WSResponse().send(HttpStatus.UNAUTHORIZED, "Invalid token.");
    }

}

我在之前的一个项目中遇到了一个问题,那个抛出异常的类还没有被Spring通过Bean实例化,但是我检查了这个类,并且实例化了引发异常的类通过@Autowired注释。

我很难理解为什么@ExceptionHandler没有做我认为应该做的事情。

要确认,我在浏览器中看到的输出是错误500 json响应;它应该是来自@ExceptionHandler

的EntityResponse
{
  "timestamp": 1470833849289,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "digital.sheppard.exceptions.InvalidWSUserException",
  "message": "No message available",
  "path": "/api/product"
}

1 个答案:

答案 0 :(得分:-1)

我正在使用JSON Web Token for Java库,如上所述,我在身份验证服务中遇到了同样的错误。我已经尝试过@ControllerAdvice,但没有解决方案。

经过长时间的研究,我找到了解决方案。您必须实施JwtFilter,而不是启动例外,您必须修改HttpServletResponse值才能添加以下内容:

if (authHeader == null || !authHeader.startsWith("Bearer ")) {
   //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN);

   response.addHeader("Content-Type", "application/json");
   response.getWriter().print(getErrorJson());    
   response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

   return;
}

final String token = authHeader.substring(7);

try {
   final Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody();
   request.setAttribute("claims", claims);
} catch (final SignatureException e) {
   //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN);

   response.addHeader("Content-Type", "application/json");
   response.getWriter().print(getErrorJson());           
   response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

   return;
}

chain.doFilter(req, res);

正如您所看到的,我已经对异常启动进行了评论,并为响应标头覆盖更改了它。 getErrorJson()将JSON值作为字符串返回(或者您只能将字符串作为正文)。

我希望这适合你。

P.D。:我已经按照instructions来实现身份验证。