如何使用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()); }