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