我无法让@ControllerAdvice
工作。我更新了我的命名空间位置,在我的xml文件中是3.1。我将带有控制器的类移动到与控制器相同的包中。我正在使用3.2.0版本的jar。如果我将@ExceptionHandler
注释放在控制器代码中,它可以工作,但不能在@ControllerAdvice
的单独类中。当@ControllerAdvice
类失败时,我会得到未捕获的异常处理程序视图。任何人都有关于如何解决这个问题的想法?
答案 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)
对于这个问题,首先要确认你的配置,
<mvc:annotation-driven/>
。或者在@ControllerAdvice Class中使用@EnableWebMvc 当你拥有正确的配置时,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 ();
}