在一个在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:
@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 bean authenticationService
。
问题:
authenticationService
定义为瞬态不会让JSF重新注入authenticationService
?javax.faces.STATE_SAVING_METHOD
设为client
?javax.faces.STATE_SAVING_METHOD
值的影响,请说明操作方法。答案 0 :(得分:2)
这很可能是由于tomcat完成了会话序列化。它正在尝试恢复序列化会话,但不会注入authenticationService。您可以安全地禁用此功能,它很少使用。要禁用它,请查找tomcat的conf / context.xml并取消注释描述为负责会话持久性管理的部分。