SpringMVC有很多很多的注解.其中有2个注解@SessionAttributes @ModelAttribute我平时一般不用,因为实在是太灵活了.但是又有一定限制,用不好容易错..

最近花了点时间研究了下,记录一下容易犯错的地方.

 

@SessionAttributes

作用范围

这个注解被@Target({ElementType.TYPE})修饰,所以只能用在类上,用于多个request共享对象.它会把Model中set过的Arrtibute自动放到sessionAttribute中.

网上有些文章说用这种方法存放的对象不能跨Controller访问.实际我测试在不同Controller中也是可以访问的.这个注解效果就是出了Controller的handler方法以后自动设置model中的对象到HttpSession里.

 

易错点

光使用这个注解是没啥卵用的,大部分时间可能是与@ModelAttribute一起使用..

当@ModelAttribute修饰Controller中的handler方法的参数的时候如果@ModelAttribute的value属性在SessionAttributes的value中的话那说明这个@ModelAttribute修饰的参数是需要从session中取值的,如果这个时候session里没有这个对象,是null的话就会报错.

 1 org.springframework.web.HttpSessionRequiredException: Expected session attribute 'XXXX'
 2     org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:115)
 3     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:753)
 4     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
 5     org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
 6     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
 7     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
 8     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
 9     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
10     javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
11     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
12     javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
13     org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
14     org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
15     org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
16     org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
17     org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
18     org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
19     org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
20     org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
21     org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
22     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
23     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
View Code

相关文章: