JSF SessionScoped托管bean-重新启动服务器后,springbean的注入为null



在一个基于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的引用。

问题:

  1. 为什么在启动过程中没有重新注入
  2. 为什么将authenticationService定义为瞬态而不向JSF发出重新注入authenticationService的信号
  3. javax.faces.STATE_SAVING_METHOD设置为client是否会影响问题
  4. 我该如何解决这个问题?如果您的解决方案受到javax.faces.STATE_SAVING_METHOD值的影响,请解释如何影响

这很可能是由于tomcat完成的会话序列化。它正在尝试恢复您的序列化会话,但不会注入authenticationService。您可以安全地禁用此功能,但它很少有任何用处。要禁用它,请查找tomcat的conf/context.xml和取消注释部分,该部分被描述为负责会话持久性管理。

最新更新