JSF页面未正确设置对象属性

时间:2012-05-23 01:51:33

标签: jsf cdi

来自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 ...

我知道这是一个非常基本的问题......但是你能指出我的错误在哪里吗?

感谢。

1 个答案:

答案 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管理注释。