【问题标题】:JSF page does not properly set object attributesJSF 页面没有正确设置对象属性
【发布时间】: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 已经默认 请求范围,所以我无法解释它。可以肯定的是,您从哪个包中导入了 @RequestScopedjavax.enterprise.context,对吧?
  • 嗨 - 是的,我是从 javax.faces.bean 导入的 - 另一个愚蠢的错误。它现在正在工作 - 谢谢队友

标签: jsf cdi


【解决方案1】:

根据您的previous question,您似乎出于某种原因在faces-config.xml 中尝试了&lt;managed-bean-scope&gt;none。使用@ManagedBean @NoneScoped 时,问题症状完全匹配。您似乎已经在faces-config.xml 以及none 范围内配置了这个bean,这完全解释了这个问题。使用none 范围,每次在EL 中评估#{userServiceImpl} 时都会创建一个全新的bean 实例。因此,您的表单提交有效地创建了 3 个 bean:一个设置了用户名,另一个设置了用户密码,另一个设置了操作。

您需要从faces-config.xml删除托管 bean 配置。当您打算使用@Inject(或@ManagedBean)时,不应使用它。 faces-config.xml 配置 bean 的方式是旧 JSF 1.x 时代遗留下来的,当时注释不可用。从 JSF 2.x 开始,它只会覆盖任何 bean 管理注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-26
    • 2017-12-10
    • 2020-05-19
    • 2012-04-22
    • 2017-12-13
    • 1970-01-01
    • 2013-05-03
    • 2012-10-02
    相关资源
    最近更新 更多