【问题标题】:Can I apply @ControllerAdvice to a view controller?我可以将@ControllerAdvice 应用于视图控制器吗?
【发布时间】:2016-05-13 16:18:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

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

    对于您的特定用例,我建议注册 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());
        }
    }
    

    【讨论】:

    • 我之前遇到过问题,即呈现给postHandleModelAndView 与实际使用的不一样; “默认”模型似乎有一个不可见的层次结构。我需要这个值可以被各个控制器覆盖,我担心无法可靠地检测到该值是否已经添加到模型中。
    • @chrylis 为了覆盖模型属性,我想你可以有条件地在postHandle 中添加模型属性。使用 modelAndView.getModel() 获取当前模型值,如果尚未提供,请添加它们。
    • 这就是我所说的“可靠检测”的意思:ModelAndViewContainer 创建了一个模型层次结构,并且查询传入的模型可能会错过“默认”(即控制器提供的 @ModelAttribute)属性。
    【解决方案2】:

    @ControllerAdvice 和其他相关注解由使用 @EnableWebMcv 或时自动注册的 RequestMappingHandlerAdapter 处理

    其他处理方法,例如资源或视图控制器由不知道@ControllerAdvice 的HttpRequestHandler 和SimpleControllerHandlerAdapter 处理。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多