【问题标题】:@SessionAttribute not being set@SessionAttribute 未设置
【发布时间】:2015-03-20 19:16:35
【问题描述】:

我真的需要你的帮助。当我突然不得不离开计算机时,我像往常一样使用我的 portlet 应用程序。当我返回时,出现 NullPointerException。好的,这是为什么呢?嗯......我的会话不包含它应该持有的对象。所以,我可能会失去一些东西,但这就是我一直看 SessionAttributes 的方式。

我的控制器是这样注释的:

@SessionAttributes({
    SOME_ATTR
})

然后我有一个带有以下签名的方法:

@Valid @ModelAttribute(SOME_ATTR) SomeObject someObject

还有我的会话属性的初始化方法:

@ModelAttribute(SOME_ATTR)
public SomeObject getSomeEmptyObject() {
    return someUtils.createSomeObject();
}

此时我调试我的应用程序时发现:

  • 手动查看会话,里面什么都没有
  • 表单已正确绑定到someObject

所以我的两个大问题是:

  • 为什么 Spring 不将 someObject 也设置为会话?
  • 当会话失效时,为什么不调用getSomeEmptyObject() 来填充空白空间?

谢谢转发!

【问题讨论】:

  • 您能否确认您正尝试从使用@SessionAttribute({SOME_ATTR}) 注释的同一控制器访问 SOME_ATTR?更重要的是,getSomeEmptyObject 在第一次调用控制器的处理方法之前被调用。但是只有在对处理程序方法的第一次调用完成之后并且在将控制权传递给视图 (JSP) 之前,对象才会从模型复制到 HttpSession。这个有帮助吗?我会尽力为您找到一些有关它的资源。
  • 这里有一些东西:intertech.com/Blog/…

标签: java session spring-mvc model liferay


【解决方案1】:

看看HttpSessionBindingListenerHttpSessionAttributeListener。如果 SomeObject 是您控制的类,则可以实现 HttpSessionBindingListener 否则您可能需要 HttpSessionAttributeListener。

This SO posting 很好地涵盖了这一点。

【讨论】:

  • 谢谢 Marc 但是.. 这如何回答我的问题?
【解决方案2】:

那么,您是否以正确的形式设置会话属性:

@SessionAttributes(value = {"user", "register"})

这就是我能想到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2011-03-03
    • 2022-01-21
    • 2016-02-25
    • 2013-04-14
    • 2012-04-15
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多