如何使用Spring MVC将会话属性作为方法参数(参数)传递
简而言之,我想要的是:
public String action(@SessionAttribute User user) {..}
代替
public String action(HttpSession session) { User user = session.getAttribute("user"); }
主要是为了:
- 可读性
- unit testing
我找到了解决方案 。
我们的想法是为AnnotationMethodHandlerAdapter
注册一个自定义的WebArgumentResolver
,它处理一个自定义注释 – @SessionAttribute
(或@SessionParam
)。
发布的代码的一个注释是,如果没有指定value
则可以使用param.getParameterName()
。
对于那些通过谷歌到达的人,至少4.3.2.RELEASE,Spring包含一个内置的@SessionAttribute
注释:
public String action( @SessionAttribute(required=false, name="user") User user) { // ... }
不再需要自定义解决方案。
即使我们使用@ModelAttribute(“user”)用户用户作为方法参数,然后在您的方法中使用用户对象,它也会从会话中更新用户。 属性名称必须与会话属性名称“user”匹配。
public String myMethod( @ModelAttribute("user") User user ){ System.out.println(user.getDetails()); }