我想在我的模型中为Spring Boot应用程序中的许多控制器中的每个@RequestMapping
设置三个公共属性。我已经阅读了@ModelAttribute
,但需要将其放在每个控制器中。我的应用程序中有20多个控制器,每个控制器都有10个@RequestMapping
。
有没有办法在应用程序开始时初始化的一个地方设置这样的模型属性?
答案 0 :(得分:0)
如果要在Spring Boot启动时执行某些代码,请考虑以下事项:
但我想你真的想要与控制器相关的行为,我建议使用全局拦截器。
使用全局拦截器,您可以干扰Spring中的请求 - 响应生命周期。
它允许您在3个不同点添加请求 - 响应生命周期的功能:
只需创建一个从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>