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

时间:2012-03-24 23:38:46

标签: spring session jsf dependency-injection

在一个在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

问题:

  1. 为什么在启动时不会重新注入?
  2. 为什么将authenticationService定义为瞬态不会让JSF重新注入authenticationService
  3. javax.faces.STATE_SAVING_METHOD设为client
  4. 是否会影响问题
  5. 我该如何解决这个问题?如果您的解决方案受javax.faces.STATE_SAVING_METHOD值的影响,请说明操作方法。

1 个答案:

答案 0 :(得分:2)

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