Как передать атрибут сеанса как аргумент метода (параметр) с помощью Spring MVC
Короче говоря, мне нужно что-то вроде:
public String action(@SessionAttribute User user) {..}
вместо
public String action(HttpSession session) {
User user = session.getAttribute("user");
}
В основном ради:
- читабельность
- модульное тестирование
Ответы
Ответ 1
Я нашел решение.
Идея состоит в регистрации пользовательского WebArgumentResolver
для AnnotationMethodHandlerAdapter
, который обрабатывает пользовательскую аннотацию - @SessionAttribute
(или @SessionParam
).
Одно примечание к размещенному коду: param.getParameterName()
может использоваться, если не указано value
.
Ответ 2
Для тех, кто прибывает через Google, по крайней мере 4.3.2.RELEASE, Spring включает @SessionAttribute
встроенную аннотацию
public String action(
@SessionAttribute(required=false, name="user") User user) {
// ...
}
Пользовательское решение больше не требуется.
Ответ 3
Даже если мы будем использовать пользовательский пользователь @ModelAttribute ( "пользователь" ) в качестве параметра метода, а затем использовать пользовательский объект в вашем методе, он будет обновлять пользователя из сеанса. Имя атрибута должно совпадать с именем атрибута сеанса "пользователь".
public String myMethod( @ModelAttribute("user") User user ){
System.out.println(user.getDetails());
}