【问题标题】:How to pass a session attribute as method argument (parameter) with Spring MVC如何使用 Spring MVC 将会话属性作为方法参数(参数)传递
【发布时间】:2010-09-01 19:03:02
【问题描述】:

简而言之,我想要这样的东西:

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

而不是

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

主要是为了:

  • 可读性
  • 单元测试

【问题讨论】:

  • 会话范围的 bean 不是您需要的吗?
  • 没有。我如何将它们作为方法参数传递?而且我不能注入它们,因为控制器是单例的。
  • 你可以使用<aop:scoped-proxy>注入它们
  • 嗯,是的,但我想要@RequestParam 之类的东西,仅用于会话 - 差异不是那么大:)

标签: java spring spring-mvc


【解决方案1】:

我找到了solution

这个想法是为AnnotationMethodHandlerAdapter注册一个自定义WebArgumentResolver,它处理一个自定义注释-@SessionAttribute(或@SessionParam)。

对发布的代码的一个注释是,如果未指定 value,则可以使用 param.getParameterName()

【讨论】:

  • 如果你有 @SessionAttribute(required = false) 用户用户怎么办。作为字符串返回的默认值与用户不匹配。你能以某种方式解决这个问题吗?
【解决方案2】:

对于那些通过 Google 到达的用户,至少从 4.3.2.RELEASE 开始,Spring 包含一个内置的 @SessionAttribute 注释:

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

    // ...

}

不再需要自定义解决方案。

【讨论】:

    【解决方案3】:

    即使我们使用 @ModelAttribute("user") 用户用户作为方法参数,然后在您的方法中使用用户对象,它也会从会话中更新用户。属性名称必须与会话属性名称“user”匹配。

    public String myMethod( @ModelAttribute("user") User user ){
    
     System.out.println(user.getDetails());
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2017-07-29
      • 2010-11-13
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多