Java Spring boot@ExceptionHandler不是';t捕获相关异常

Java Spring boot@ExceptionHandler不是';t捕获相关异常,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在使用SpringBoot构建一个API。我已经设置了一个身份验证过滤器,从请求头获取令牌并对其进行身份验证。如果使用令牌找不到用户,则引发InvalidWSUserException 我创建了一个类来保存许多@ExceptionHandler,这样我就可以捕获InvalidWSUserException并用JSON字符串响应,通知请求客户端他们请求中的令牌无效 我曾在另一个项目中使用过这个,但我似乎无法在这个新项目中使用它 InvalidWSUserException为空,因为处理程序应处

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

我创建了一个类来保存许多@ExceptionHandler,这样我就可以捕获InvalidWSUserException并用JSON字符串响应,通知请求客户端他们请求中的令牌无效

我曾在另一个项目中使用过这个,但我似乎无法在这个新项目中使用它

InvalidWSUserException为空,因为处理程序应处理响应

public class InvalidWSUserException extends RuntimeException {
}
我已经这样定义了handler类

@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"
}
我正在使用library,正如您上面所说的,我在身份验证服务中遇到了相同的错误。我尝试过@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.:为了实现auth,我遵循了这一点。

您找到了好的解决方案吗?