我无法
@ControllerAdvice
上班。 我更新了我的命名空间位置,在我的 xml 文件中为 3.1。 我将带有控制器的类移至与控制器相同的包中。 我正在使用 3.2.0 版本的 jar。 如果我将 @ExceptionHandler
注释放在控制器代码中,它可以工作,但不能与 @ControllerAdvice
放在单独的类中。 当 @ControllerAdvice
类失败时,我会得到未捕获的异常处理程序视图。 有人知道如何解决这个问题吗?
如果您使用类路径扫描,可能您必须向您的
<context:component-scan>
元素添加新的包含过滤器:
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
默认扫描不会查找该注解,跟随 spring-context-3.2.xsd 进行
component-scan
:
“扫描类路径以查找将自动注册为 Spring beans 的带注释组件。默认情况下,将检测 Spring 提供的 @Component、@Repository、@Service 和 @Controller 构造型。”
对于这个问题,首先要确认你的配置,
<mvc:annotation-driven/>
。或者在你的@ControllerAdvice类中有@EnableWebMvc当你的配置正确时,ControllerAdvice 应该已经可以工作了,现在你说你得到了未捕获的异常处理程序视图。我猜你在 InegrationTest 中得到了这一点,并且你使用了 mockMvc 来测试它,如果是这样,你需要放置 @WebAppConfiguration 并构建 mokcMvc,如下所示:
@Autowired
private WebApplicationContext wac;
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
使用standaloneSetup(控制器)将不起作用,因为缺少WebApplicationContext。
我也遇到了同样的问题,在我的例子中,问题是有一个依赖库,里面有一个带有 @ControllerAdvice 和 @Order(Ordered.HIGHEST) 注释的类,为了解决这个问题,我添加了 @Order(Ordered) .HIGHEST)注释在我的班级中,现在它可以工作了。
由于我的异常类位于同一个控制器包中,即使两个类具有相同的 @Order(Ordered.HIGHEST),spring 也给了我的类更高的优先级
@ControllerAdvice
@Order(Ordered.HIGHEST)
public class RestResponseEntityExceptionHandler
extends ResponseEntityExceptionHandler {
无需额外配置。它应该可以工作。查看此链接了解更多详细信息。这提供了非常简单的例子:
我遇到了同样的问题,在单元测试 REST 控制器的异常时,我的 @ControllerAdvice 类无法加载。如果您使用的是 Spring Boot(版本 4),那么您可以使用 Spring 添加的其他方法在独立设置控制器时加载控制器建议类。
mockMvc = MockMvcBuilders
.standaloneSetup(new YourRestController())
.setControllerAdvice(new ControllerAdviceClass())
.build();
这将立即初始化您的控制器建议类,并且您的 Junit 测试应该能够跳转到控制器建议类中定义的 @ExceptionHandler 方法。
对我来说,
@ControllerAdvice
根本不起作用。即使添加 @EnableWebMvc
或 @WebAppConfiguration
也没有任何改变。
我能够让它发挥作用的方式是,
@ExceptionHandler
类添加 AbstractController
方法,所有其他控制器都在该类上扩展。 我认为
@ControllerAdvice
应该做同样的事情,即将 ExceptionHandler
指定的类下定义的 @@ControllerAdvice
方法编译到每个控制器都可以引用的公共位置。但不幸的是它对我不起作用。
我通过在配置bean中定义ControlAdvice类解决了这个问题,如下所示:
@Primary
@Bean
public RestResponseEntityExceptionHandler restResponseEntityExceptionHandler (){
return new RestResponseEntityExceptionHandler ();
}
就我而言,我的异常处理类(带有
@RestControllerAdvice
)是 ResponseEntityExceptionHandler
的子类。在尝试让它工作 6 小时后,我将其设为独立类(删除了子类状态),并且它起作用了。