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

@ControllerAdvice不处理异常

祁飞扬
2023-03-14

我正在使用Spring Boot 1.5.9开发我的应用程序。我需要实现jwt身份验证,我使用了jjwt库。以下代码来自我的自定义身份验证安全筛选器,它继承自OncePerRequestFilter。在这里,我试图从令牌解析用户名,当自动解析用户名时,jwt会验证用户名,并检查令牌的过期时间。我调试了它,它可以工作,所以接下来我想向客户端应用发送正确的消息,说明身份验证失败的原因。我想抛出一个ExpiredJwtException,并使用控制器建议对输出进行格式化处理。

下面是异常抛出:

try {
    username = jwtTokenService.getUsername(authToken);
} catch (IllegalArgumentException e) {
    logger.error("an error occured during getting username from token", e);
} catch (ExpiredJwtException e) {
    logger.warn("the token is expired and not valid anymore", e);
    throw new ExpiredJwtException(e.getHeader(), e.getClaims(), e.getMessage());
}

这是我的控制器建议,JwtExctive是我抛出的过期JwtExctive的基类,所以它应该可以工作。我也尝试过在ExceptionHandler中直接使用过期JwtExctive,但不起作用。接下来我想用同样的方式处理另一个异常。

@ControllerAdvice
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public @ResponseBody
    ResponseEntity<Map<String, Object>> handleException(Exception ex) {
        Map<String, Object> errorInfo = new HashMap<>();
        errorInfo.put("message", ex.getMessage());
        errorInfo.put("status", HttpStatus.BAD_REQUEST);
        errorInfo.put("status_code", HttpStatus.BAD_REQUEST.value());
        return new ResponseEntity<>(errorInfo, HttpStatus.BAD_REQUEST);
    }


    @ExceptionHandler(JwtException.class)
    //@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
    public @ResponseBody
    ResponseEntity handleJwtException(JwtException ex) {
        Map<String, Object> errorInfo = new HashMap<>();
        errorInfo.put("message", ex.getLocalizedMessage());
        errorInfo.put("status", HttpStatus.UNPROCESSABLE_ENTITY);
        errorInfo.put("status_code", HttpStatus.UNPROCESSABLE_ENTITY.value());
        return new ResponseEntity<>(errorInfo, HttpStatus.UNPROCESSABLE_ENTITY);
    }

}

我想要返回4xx状态的响应,但是当我的异常被抛出时,我总是有5xx内部错误。你能告诉我我的代码有什么问题吗?谢谢建议。

共有3个答案

彭兴朝
2023-03-14

我还遇到了这样一个问题,restcontrolleradvise没有处理异常,问题是advice方法只能在其签名中包含异常抛出方法拥有或可以提供的参数。我的AOP方法无法访问头,因此无法向RestControllerAvice方法提供头。当我在RestController中创建了一个新的异常处理程序方法,但没有将头作为参数时,RestControllerAvice就开始按预期工作。详细信息

罗绪
2023-03-14

让控制器扩展ResponseEntityExceptionHandler,并让异常处理方法将WebRequest作为参数

然后把你的返回值改成这个

return handleExceptionInternal(ex, errorInfo, new HttpHeaders(), HttpStatus.BAD_REQUEST, request);

HttpStatus。错误请求可以更改为任何40倍的错误

异常的示例。类

@ExceptionHandler(value = { Exception.class })
protected ResponseEntity<Object> handleUncaughtException(Exception ex, WebRequest request) {

  String message = "Something bad happened";

  return handleExceptionInternal(ex, message, new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}

根据这一点,让简单的servlet过滤器与@ControllerAdvice一起工作,您可以创建一个自定义处理程序。

然后将您的新处理程序添加到您的WebSecurityConfigrerAdapter

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new CustomHandler());
}
关正雅
2023-03-14

如果在筛选器中抛出异常,则不涉及Springs异常处理(@Controlller建议@ExceptionHandler)。您需要捕获筛选器中的所有异常,并直接使用Servlet响应

据我所知,过滤器是低级逻辑(spring基础设施之前的请求处理),但您可以有一个变通方法,比如一个特定的过滤器,它包装链接并捕获所有运行时异常。(看起来像是一场危机,但没有其他解决方案)。

如果你想有一个特定的登录来创建你的异常对象-覆盖ErrorAt0013 tesbean。它将允许你对所有应用程序异常有一个单一的视图。

要直接指定http响应状态,请使用httpServletResponse。设置状态(…您的状态代码…)

 类似资料:
  • 我已经浏览了所有相关的帖子,但是我的@Controlller建议似乎没有处理从Controller类抛出的自定义异常。但是@Controller类中的@ExceptionHandler确实处理了异常。我不知道是什么错误。 网状物xml: dispatcher servlet。xml: @控制器建议等级: @ControllerAdvice与控制器位于同一个包中。

  • 我有以下方法: 在序列化期间调用。 枚举异常扩展了异常 我的控制器方法: 事务类: 在此setter中,引发枚举异常 在调试方法时,我看到它正在从响应EntityExceptionHandler类调用方法而不是我的方法 在抛出EnumException的情况下,我得到400状态代码和空响应正文。 为什么不执行异常处理程序方法? 以下是日志:

  • 我有一个带有REST方法的控制器类,可以抛出各种异常。我已经决定在一个单独的类中处理这些异常,在我的处理程序方法中使用@ControlllerAdwn和@ExceptionHandler。但是,我有一个问题,我的REST方法使用另一个库的注释。此库捕获REST方法引发的异常。现在,我正在全局处理异常,而不是直接通过REST方法中的试/捕获,我的异常总是被其他库捕获,而不是被我自己的处理程序方法捕获

  • 我尝试用的一个实例替换错误处理程序,但没有成功。 我尝试创建自己的CustomErrorHandler,但这也不合适,因为在重新路由到自定义错误控制器时,原始异常已不再存在于该异常中。为了向客户端返回适当的响应,需要这些信息。 吾如何曰: 使SpringBoot不将异常转发到异常控制器。 还原@ControllerAdvice异常处理程序,这样我就可以返回适当的响应正文和状态代码。

  • 我有以下控制器类 } 对于异常处理,我使用Spring3。2.建议如下: } 我将XML bean定义为 控制器通知处理程序不处理从控制器引发的异常。我在谷歌上搜索了几个小时,但找不到它发生的原因。我照着描述的做了http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/在这里 如果有人知道,请告诉

  • 我最近在我的Spring4/Hibernate Web应用程序中实现了Spring Security来处理登录/退出和不同的用户角色。 经过大量阅读,它现在似乎工作得很好,但我注意到,由于错误的Spring Security配置而引发的异常没有使用我的自定义处理程序进行优雅的处理,而是显示为一个丑陋的Tomcat错误页面(显示HTTP状态500-UserDetailsService是必需的,后跟一