В приложении JSF 2, разработанном на tomcat, у меня есть следующий управляемый компонент SessionScoped:
@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>
ПРОБЛЕМА:
LoginBean
работает нормально, когда я запускаю tomcat в первый раз утром. Но если я затем перезагружаю tomcat и сразу пытаюсь получить доступ к LoginBean.login()
, я получаю исключение NullPointerException для authenticationService
.
Я определил authenticationService
как временный, чтобы он не сохранялся в сеансе. Но при перезапуске кота он не впрыскивается снова со ссылкой на боб весны authenticationService
.
Вопросы:
- Почему он не вводится повторно при запуске?
- Почему определение
authenticationService
как переходного процесса не сигнализирует JSF повторно вводить authenticationService
?
- На проблему влияет установка
javax.faces.STATE_SAVING_METHOD
как client
?
- Как я могу решить эту проблему? Если на ваше решение влияет значение
javax.faces.STATE_SAVING_METHOD
, пожалуйста, объясните как.