为每个控制器中的每个操作设置模型属性

时间:2017-06-05 11:36:15

标签: java spring spring-mvc model-view-controller spring-boot

我想在我的模型中为Spring Boot应用程序中的许多控制器中的每个@RequestMapping设置三个公共属性。我已经阅读了@ModelAttribute,但需要将其放在每个控制器中。我的应用程序中有20多个控制器,每个控制器都有10个@RequestMapping

有没有办法在应用程序开始时初始化的一个地方设置这样的模型属性?

2 个答案:

答案 0 :(得分:0)

如果要在Spring Boot启动时执行某些代码,请考虑以下事项:

Spring boot startup listener

但我想你真的想要与控制器相关的行为我建议使用全局拦截器

使用全局拦截器,您可以干扰Spring中的请求 - 响应生命周期。

它允许您在3个不同点添加请求 - 响应生命周期的功能:

  1. 在控制器处理请求之前
  2. 处理程序完成其功能后
  3. 当视图即将呈现给最终用户时。
  4. 只需创建一个从HandlerInterceptorAdapter扩展的类,并使用所需的功能覆盖三种方法之一。

    例如:

    public class MyInterceptor extends HandlerInterceptorAdapter {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            request.setAttribute("myFirstAttribute", "MyFirstValueHere");
            return super.preHandle(request, response, handler);
        }
    
    }
    

    以下是有关如何使用Spring Boot执行此操作的示例:

    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
      @Autowired 
      MyInterceptor myInterceptor;
    
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(...)
        ...
        registry.addInterceptor(myInterceptor);
      }
    }
    

答案 1 :(得分:0)

我提供了SpringMVC的另一种方法,使用 HandlerInterceptor ,当你实现它时,它提供了3种方法,每种方法都包含 HttpServletRequest ,您可以使用request.setAttribute("xx","yy")设置属性,下面是代码:

public class RequestInterceptor implements HandlerInterceptor {

    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }

    public void postHandle(HttpServletRequest request, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
      //you can set attributes here like request.setAttribute("xx","yy")
    }

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object arg2) throws Exception {
        //you can set attributes here like request.setAttribute("xx","yy")
        return false;
    }

}

然后,您需要将自定义拦截器添加到spring mvc应用程序中,如下所示:

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
   <property name="interceptors">
    <list>
      <!--class of your custom interceptor-->
      <bean class="com.xx.RequestInterceptor"/>
    </list>
   </property>
</bean>