24

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

4

7 回答 7

18

如果您使用类路径扫描,可能您必须向<context:component-scan>元素添加新的包含过滤器:

<context:include-filter type="annotation" 
    expression="org.springframework.web.bind.annotation.ControllerAdvice" />

默认扫描不查找此注释,遵循 spring-context-3.2.xsd for component-scan

“扫描类路径以查找将自动注册为 Spring bean 的注释组件。默认情况下,将检测 Spring 提供的 @Component、@Repository、@Service 和 @Controller 原型。”

于 2013-09-24T20:56:23.697 回答
9

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

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

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

 @Autowired
private WebApplicationContext wac;

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

由于缺少 WebApplicationContext,使用standaloneSetup(controller) 将不起作用。

于 2013-12-20T05:26:04.150 回答
7

我遇到了同样的问题,就我而言,问题是有一个依赖库,其中有一个带有@ControllerAdvice 和@Order(Ordered.HIGHEST) 注释的类,为了解决我添加了@Order(Ordered. HIGHEST)注释在我的课堂上,现在它可以工作了。

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

@ControllerAdvice
@Order(Ordered.HIGHEST)
public class RestResponseEntityExceptionHandler 
  extends ResponseEntityExceptionHandler { 
于 2019-09-12T17:49:56.420 回答
6

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

于 2013-10-14T15:37:45.800 回答
3

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

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

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

于 2016-04-28T21:37:28.040 回答
0

对我来说,@ControllerAdvice不惜一切代价工作。即使添加@EnableWebMvc@WebAppConfiguration没有进行任何更改。

我能够使它工作的方式是,

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

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

于 2018-02-08T05:15:02.820 回答
0

我通过在 Configuration bean 中定义 ControlAdvice 类来解决它,如下所示:

@Primary 
@Bean 
public RestResponseEntityExceptionHandler restResponseEntityExceptionHandler (){    
       return new RestResponseEntityExceptionHandler (); 
}
于 2020-05-12T16:14:18.437 回答