在一个基于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
是弹簧的@服务:
@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时,CCD_ 2运行良好。但是,如果我重新启动tomcat并立即尝试访问LoginBean.login()
,我将在authenticationService
上得到一个NullPointerException。
我已经将authenticationService
定义为瞬态,这样它就不会保存到会话中。但当重新启动tomcat时,它不会再次注入对springbean authenticationService
的引用。
问题:
- 为什么在启动过程中没有重新注入
- 为什么将
authenticationService
定义为瞬态而不向JSF发出重新注入authenticationService
的信号 - 将
javax.faces.STATE_SAVING_METHOD
设置为client
是否会影响问题 - 我该如何解决这个问题?如果您的解决方案受到
javax.faces.STATE_SAVING_METHOD
值的影响,请解释如何影响
这很可能是由于tomcat完成的会话序列化。它正在尝试恢复您的序列化会话,但不会注入authenticationService。您可以安全地禁用此功能,但它很少有任何用处。要禁用它,请查找tomcat的conf/context.xml和取消注释部分,该部分被描述为负责会话持久性管理。