【发布时间】:2012-05-23 01:51:33
【问题描述】:
来自 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 属性为空。我调试了应用程序并调用了 getUser 方法并正确设置了值,但是在调用 authenticateUser 之前的某个时间点(我还没有找到[尚未])用户属性设置为 null...
我知道这是一个非常基本的问题......但是你能指出我的错误在哪里吗?
谢谢。
【问题讨论】:
-
不使用@PostConstruct 方法创建新用户,为什么不直接初始化它。您发布的代码中也没有用户字段,可能已经忘记了。
-
抱歉,我确实错过了 User 类代码。我这里没有代码(此时我正在工作)——但是这个类是一个 POJO:有两个属性(名称和密码)和四个方法:setName、getName、setPassword 和 getPassword。由于个人口味,我使用@PostConstruct - 没有其他原因。我曾试图移动 user = new User();到构造函数,但它没有解决问题。
-
这个问题表明每次评估 EL 表达式时都会构造一个新的
UserServiceImpl实例。如果在 setter 方法调用和 action 方法调用期间它是不同的,您可以通过在调试器中检查类的哈希码来确认它。当您使用@ManagedBean时,我可以解释这个问题,但是您在这里使用CDI@Inject已经默认 请求范围,所以我无法解释它。可以肯定的是,您从哪个包中导入了@RequestScoped?javax.enterprise.context,对吧? -
嗨 - 是的,我是从 javax.faces.bean 导入的 - 另一个愚蠢的错误。它现在正在工作 - 谢谢队友