为所有控制器调用@ControllerAdvice,而不仅仅是basePackageClasses

时间:2017-08-29 11:53:07

标签: java spring spring-mvc

我无法提供实际的代码,因为它在另一个系统上,但我在Spring 4.2.6 Web Release中看到的问题是使用basePackageClasses而不是实际映射到控制器。

假设我有3个控制器:AController.class,BController.class和CController.class。

我为每个人创建了一个ControllerAdvice:AControllerAdvice.class,BControllerAdvice.class& CControllerAdvice.class。

我使用注释如下:

@ControllerAdvice(basePackageClasses = AController.class)
public class AControllerAdvice{
  @ModelAttribute
  public void addModelInformation(Model model){
    //controller specific model information for header and footer added here
  }
}

我所遇到的是,当我在AController.class中调用rest方法时,我已经通过日志记录验证了' addModelInformation'从所有三个ControllerAdvice调用方法,因此Spring的排序调用的最后一个方法设置页眉和页脚的净效果,页眉和页脚保持静态。

通过文档Spring应该支持,我的理解是只应该调用驻留在该映射控制器中的rest方法的ControllerAdvice。所以我必须得出结论,我设置了一些错误的东西。我正在使用JavaConfig,期待收到你们的回复!

2 个答案:

答案 0 :(得分:2)

您应该使用assignableTypes

@ControllerAdvice(assignableTypes = AController.class)
public class AControllerAdvice {
    @ModelAttribute
    public void addModelInformation(Model model){
         //controller specific model information for header and footer added here
    }
}

答案 1 :(得分:-1)

您应该将配置类传递给@ControllerAdvice的basePackageClasses而不是控制器类。

假设您的配置名为ConfigClass

@Configuration
public class ConfigClass {
    @Bean
    public AController controllerA() {
        ....
    }
    ... // your controllers to be weaved
}

然后你应该用

设置建议

@ControllerAdvice(basePackageClasses = ConfigClass.class)