我可以将@ControllerAdvice应用于视图控制器吗?

时间:2016-05-13 16:18:15

标签: java spring spring-mvc

我正在尝试为我的控制器的所有设置默认模型值,这是由我的HTML模板的布局解释的(这是为所有页面添加顶部横幅,例如至于警告即将到来的维修)。我用@ControllerAdvice方法编写了一个@ModelAttribute类,这在我的所有自定义控制器上都能正常工作。

但是,当我访问直接使用ViewControllerRegistry注册的映射时,它什么都不做;该方法从未被调用过,ParameterizableViewController似乎绕过了正常的绑定和模型生成。

有没有办法编写可以应用于视图控制器和自定义控制器的建议?

2 个答案:

答案 0 :(得分:2)

  

有没有办法编写将应用于视图的建议   控制器和自定义控制器?

对于您的特定用例,我建议您注册HandlerInterceptor并将您的常用模型属性添加到ModelAndView方法的postHandle实例中。如下所示:

public class CommonModelInterceptor extends HandlerInterceptorAdapter {
    @Override
    public void postHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler, 
                           ModelAndView modelAndView) throws Exception {
        modelAndView.addObject("Favorite Quote", "Welcome to the real world");
       // Go crazy with modelAndView
    }
}

另外,不要忘记注册你的拦截器:

public class WebConfig extends WebMvcConfigurerAdapter {
    // Usual stuff

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CommonModelInterceptor());
    }
}

答案 1 :(得分:0)

@ControllerAdvice和其他相关注释由使用@EnableWebMcv或

时自动注册的RequestMappingHandlerAdapter处理

其他处理方法,例如资源或视图控制器由HttpRequestHandler和SimpleControllerHandlerAdapter处理,它们没有@ControllerAdvice的知识。

您可以编写一个自定义的HandlerInterceptor,它是应用程序范围的,用于处理公共逻辑,并使用WebMvcConfigurer的addInterceptors方法来注册拦截器