How to pass a session attribute as method argument

2019-01-11 04:29发布

问题:

In short, I want something like:

public String action(@SessionAttribute User user) {..}

instead of

public String action(HttpSession session) {
     User user = session.getAttribute("user");
}

Mainly for the sake of:

  • readability
  • unit testing

回答1:

I found a solution.

The idea is to register a custom WebArgumentResolver for the AnnotationMethodHandlerAdapter, which handles a custom annotation - @SessionAttribute (or @SessionParam).

One note to the code posted there is that param.getParameterName() can be used if no value is specified.



回答2:

For those arriving via Google, as of at least 4.3.2.RELEASE, Spring includes a @SessionAttribute annotation built-in:

public String action(
    @SessionAttribute(required=false, name="user") User user) {

    // ...

}

A custom solution is no longer necessary.



回答3:

Even if we use @ModelAttribute("user") User user as the method parameter and then use user object in your method it will have updated user from session. The attribute name has to match with the session attribute name "user".

public String myMethod( @ModelAttribute("user") User user ){

 System.out.println(user.getDetails());

}