Spring 3.2 @ControllerAdvice 不工作

问题描述 投票:0回答:8

我无法

@ControllerAdvice
上班。 我更新了我的命名空间位置,在我的 xml 文件中为 3.1。 我将带有控制器的类移至与控制器相同的包中。 我正在使用 3.2.0 版本的 jar。 如果我将
@ExceptionHandler
注释放在控制器代码中,它可以工作,但不能与
@ControllerAdvice
放在单独的类中。 当
@ControllerAdvice
类失败时,我会得到未捕获的异常处理程序视图。 有人知道如何解决这个问题吗?

spring-mvc exception
8个回答
17
投票

如果您使用类路径扫描,可能您必须向您的

<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 构造型。”


10
投票

对于这个问题,首先要确认你的配置,

  1. 您需要确保 @ControllerAdvice 类位于您的组件扫描基础包下。
  2. 确保您在 spring-servlet.xml 中使用
    <mvc:annotation-driven/>
    。或者在你的@ControllerAdvice类中有@EnableWebMvc

当你的配置正确时,ControllerAdvice 应该已经可以工作了,现在你说你得到了未捕获的异常处理程序视图。我猜你在 InegrationTest 中得到了这一点,并且你使用了 mockMvc 来测试它,如果是这样,你需要放置 @WebAppConfiguration 并构建 mokcMvc,如下所示:

 @Autowired
private WebApplicationContext wac;

mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

使用standaloneSetup(控制器)将不起作用,因为缺少WebApplicationContext。


9
投票

我也遇到了同样的问题,在我的例子中,问题是有一个依赖库,里面有一个带有 @ControllerAdvice 和 @Order(Ordered.HIGHEST) 注释的类,为了解决这个问题,我添加了 @Order(Ordered) .HIGHEST)注释在我的班级中,现在它可以工作了。

由于我的异常类位于同一个控制器包中,即使两个类具有相同的 @Order(Ordered.HIGHEST),spring 也给了我的类更高的优先级

@ControllerAdvice
@Order(Ordered.HIGHEST)
public class RestResponseEntityExceptionHandler 
  extends ResponseEntityExceptionHandler { 

7
投票

无需额外配置。它应该可以工作。查看此链接了解更多详细信息。这提供了非常简单的例子:


3
投票

我遇到了同样的问题,在单元测试 REST 控制器的异常时,我的 @ControllerAdvice 类无法加载。如果您使用的是 Spring Boot(版本 4),那么您可以使用 Spring 添加的其他方法在独立设置控制器时加载控制器建议类。

mockMvc = MockMvcBuilders
   .standaloneSetup(new YourRestController())
   .setControllerAdvice(new ControllerAdviceClass())
   .build();

这将立即初始化您的控制器建议类,并且您的 Junit 测试应该能够跳转到控制器建议类中定义的 @ExceptionHandler 方法。


1
投票

对我来说,

@ControllerAdvice
根本不起作用。即使添加
@EnableWebMvc
@WebAppConfiguration
也没有任何改变。

我能够让它发挥作用的方式是,

  • 为我的
    @ExceptionHandler
    类添加
    AbstractController
    方法,所有其他控制器都在该类上扩展。

我认为

@ControllerAdvice
应该做同样的事情,即将
ExceptionHandler
指定的类下定义的 @
@ControllerAdvice
方法编译到每个控制器都可以引用的公共位置。但不幸的是它对我不起作用。


0
投票

我通过在配置bean中定义ControlAdvice类解决了这个问题,如下所示:

@Primary 
@Bean 
public RestResponseEntityExceptionHandler restResponseEntityExceptionHandler (){    
       return new RestResponseEntityExceptionHandler (); 
}

0
投票

就我而言,我的异常处理类(带有

@RestControllerAdvice
)是
ResponseEntityExceptionHandler
的子类。在尝试让它工作 6 小时后,我将其设为独立类(删除了子类状态),并且它起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.