来自JSF初学者的简单问题:
我有非常简单的JSF表单:
<h:form>
<p>#{messages.loginTextfieldUsername}</p>
<h:inputText value="#{userServiceImpl.user.name}" />
<p>#{messages.loginTextfieldPassword}</p>
<h:inputSecret value="#{userServiceImpl.user.password}" />
<h:commandButton value="#{messages.loginButtonLogin}" action="#{userServiceImpl.authenticateUser}" />
</h:form>
userServiceImpl类是:
@Named
@RequestScoped
public class UserServiceImpl implements UserService {
private UserSession userSession;
private User user;
@Inject
public UserServiceImpl(UserSession userSession) {
this.userSession = userSession;
}
@PostConstruct
public void prepareService() {
user = new User();
}
@Override
public View authenticateUser() {
userSession.setLoggedUser(user);
return View.MAIN;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
我的目标非常简单:当用户点击登录按钮时,我想验证用户身份。
问题是: 调用authenticate方法时,User属性为null。我调试了应用程序并调用了getUser方法,并且正确设置了值,但是在调用authenticateUser之前的某些时候(我还没有找到),用户属性设置为null ...
我知道这是一个非常基本的问题......但是你能指出我的错误在哪里吗?
感谢。
答案 0 :(得分:0)
根据您的previous question,由于某种原因,您似乎已经在<managed-bean-scope>
中对none
faces-config.xml
进行了实验。使用@ManagedBean @NoneScoped
时,问题症状完全匹配。您似乎已在faces-config.xml
以及none
范围内配置了此bean,这完全解释了此问题。使用none
范围,每次在EL中评估#{userServiceImpl}
时都会创建一个全新的bean实例。因此,您的表单提交有效地创建了3个bean:一个用户名设置,另一个用户密码设置,另一个用于调用操作。
您需要从faces-config.xml
删除托管bean配置。当您打算使用@Inject
(或@ManagedBean
)时,不应使用它。当注释不可用时,配置bean的faces-config.xml
方式是旧JSF 1.x时代的剩余方式。从JSF 2.x开始,它只会覆盖任何bean管理注释。