【发布时间】:2012-04-09 01:03:50
【问题描述】:
在一个基于 tomcat 开发的 JSF 2 应用程序中,我有以下 SessionScoped 托管 bean:
@ManagedBean(name = "loginBean")
@SessionScoped
public class LoginBean implements Serializable {
private static final long serialVersionUID = 1L;
private String login;
private String password;
@ManagedProperty(value = "#{authenticationService}")
transient private AuthenticationService authenticationService;
public String login() {
boolean success = authenticationService.login(login, password); // after restarting tomcat, authenticationService is null here!
//........
}
}
authenticationService是spring的@Service:
@Service("authenticationService")
public class AuthenticationServiceImpl implements AuthenticationService, Serializable {
private static final long serialVersionUID = 1L;
//....
}
另外,我已经定义了要保存在客户端的会话:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
问题:
当我早上第一次启动 tomcat 时,LoginBean 工作正常。但是,如果我然后重新启动 tomcat 并立即尝试访问 LoginBean.login(),我会在 authenticationService 上收到 NullPointerException。
我已将authenticationService 定义为瞬态,这样它就不会被保存到会话中。但是重启tomcat时,并没有再次注入对spring beanauthenticationService的引用。
问题:
- 为什么开机不重新注入?
- 为什么将
authenticationService定义为瞬态不通知 JSF 重新注入authenticationService? - 设置
javax.faces.STATE_SAVING_METHOD为client会影响问题吗? - 我该如何解决这个问题?如果您的解决方案受到
javax.faces.STATE_SAVING_METHOD值的影响,请说明原因。
【问题讨论】:
-
我对 Spring 部分一无所知,因为我从未真正使用过它,但我只是想让您知道使用 EJB 时不会出现此问题(这就是 Spring试图取代)。你不应该只创建服务属性
transient,因为你基本上是在告诉它永远不应该被序列化。 -
如果你使用 Spring,那么使用 Spring IoC 容器进行注入总是比使用 JSF 容器更好。这样您甚至可以轻松管理代码。按照这个question's 回答如何将 JSF 与 Spring 集成
-
@BalusC 谢谢!如果我不将服务属性设置为
transient,它将在重新启动服务器后被反序列化,但它的所有内部数据都将是陈旧的,而且它不会附加到 Spring `applicationContect'。我想要的服务 bean 是在重新启动期间由 Spring 重新创建和自动装配,就像 Spring 在重新启动之前没有找到保存到磁盘但用户尝试访问的序列化会话时所做的那样重新启动后具有相同会话 ID(相同 cookie)的服务器。请看stackoverflow.com/questions/3778353 -
@Ravi 我认为我的代码应该可以正常工作。请看一下这个示例项目:technology-for-human.blogspot.com/2011/01/…(您可以下载代码并查看)。在全新安装的 tomcat 7 上,这段代码实际上对我有用。问题是,它不适用于我的生产 tomcat(相同版本),它经历了一些配置修改(不确定是哪个,我没有制作它们)。可能是默认情况下tomcat 7不会序列化会话。我还能在哪里更改此设置?请在下面查看 mrembisz 的回答。
标签: spring session jsf dependency-injection