当前位置: 首页 > 知识库问答 >
问题:

Spring boot@ExceptionHandler没有捕捉到相关异常

易焱
2023-03-14

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

我已经在另一个项目中工作了这个,但我似乎无法在这个新项目中工作。

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

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.");
    }

}

为了确认,我在浏览器中看到的输出是错误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个答案

商畅
2023-03-14

我正在使用JSON Web Token for Java library,正如您在上面提到的,我在身份验证服务中遇到了同样的错误。我尝试使用@ControllerAdvise,但没有解决方案。

经过长时间的研究,我找到了解决办法。您必须实现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值作为字符串返回(或者只能将字符串作为主体)。

 类似资料:
  • 本文向大家介绍.NET Framework 捕捉异常,包括了.NET Framework 捕捉异常的使用技巧和注意事项,需要的朋友参考一下 示例 在特殊情况下,代码可以并且应该引发异常。例如: 尝试阅读流的末尾 没有访问文件的必要权限 尝试执行无效的操作,例如被零除 从Internet下载文件时发生超时 调用方可以通过“捕获”它们来处理这些异常,并且仅应在以下情况下进行: 它实际上可以解决特殊情况

  • 然后我把它用作: 但是最后一行代码没有捕获任何异常,我的代码给出运行时异常并停止。你能解释为什么会发生这种情况,如果可能的话,如何修复它吗?

  • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

  • 问题内容: 据我所知,netty通过重写方法exceptionCaught()处理异常。但是我想要的是一个可以处理所有异常的处理程序。因此,管道应类似于: InboundExceptionHandler- inboundHandler1-inboundHandler2-outboundHandler1-outboundHandler2-OutboundExceptionHandler 这意味着我应

  • 在spring boot annotate中使用@Transactional从控制器调用update(),此update()调用update2()。所以,当我尝试使用update2()将重复值保存到数据库中时,它不会向update()抛出异常,而是转到控制器方法。我想在update()中处理异常。

  • 问题内容: 我正在尝试编写一个使用PyQt5在系统托盘中运行的应用程序。该代码有时会引发异常,我需要能够捕获它们。 我希望当应用程序中发生异常时,会退出主事件循环,因此像这样捕获它应该起作用: 在下面的示例中,当我按下“提高”按钮时,我仅看到回溯,但从未看到打印过的内容。 有2个类似的问题,但是那里的答案并没有满足我的需要: 抓住PyQt中的任何异常:OP希望 监视 异常,不退出偶数循环。 防止P