Spring 3.2 @ControllerAdvice不工作

时间:2013-08-21 00:43:07

标签: spring-mvc exception-handling

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

7 个答案:

答案 0 :(得分:15)

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

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

默认扫描不会在component-scan的spring-context-3.2.xsd之后查找此注释:

  

&#34;扫描将自动注册为Spring bean的带注释组件的类路径。默认情况下,将检测Spring提供的@Component,@ Repository,@ Service和@Controller构造型。&#34;

答案 1 :(得分:9)

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

  1. 您需要确保组件扫描基础包下的@ControllerAdvice类。
  2. 在spring-servlet.xml中使用<mvc:annotation-driven/>。或者在@ControllerAdvice Class中使用@EnableWebMvc
  3. 当你拥有正确的配置时,ControllerAdvice应该已经工作了,现在你说你得到了未被捕获的异常处理程序视图。我猜你在你的InegrationTest中得到了这个,你用mockMvc来测试它,如果是这样,你需要把@WebAppConfiguration和build mokcMvc建立如下:

     @Autowired
    private WebApplicationContext wac;
    
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    

    使用standaloneSetup(控制器)将无法正常工作,因为缺少WebApplicationContext。

答案 2 :(得分:8)

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

http://www.javabeat.net/2013/10/exception-controlleradvice-spring-3-2/

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:0)

对我来说,@ControllerAdvice并不是不惜一切代价。即使添加@EnableWebMvc@WebAppConfiguration也没有做任何更改。

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

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

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

答案 5 :(得分:0)

我遇到了同样的问题,在我的情况下,问题是有一个依赖库在其中包含带有@ControllerAdvice和@Order(Ordered.HIGHEST)批注的类,以解决该问题,我添加了@Order (Ordered.HIGHEST)注释在我的课堂中,现在可以使用。

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

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

答案 6 :(得分:0)

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

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