【发布时间】:2020-01-23 13:00:38
【问题描述】:
我想使用 ManagedBean 类 Users.java 创建 2 个具有不同范围的 bean 实例。我尝试通过两种方式做到这一点:
1。 为用户使用 ManagedBean 和 SessionScope 注释(这将创建一个具有会话范围的“用户”),并在 faces-config.xml 中声明来自用户的另一个 MenagedBean,具有请求范围。
@ManagedBean
@Component
@SessionScoped
public class Users implements Serializable {...}
注意:“组件”来自Spring框架,暂时可以忽略。
在 faces-config.xml 中:
<managed-bean>
<managed-bean-name>newUser</managed-bean-name>
<managed-bean-class>ro.telacad.model.Users</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
在登录页面中,我在里面使用“#{users.}”。对于这种情况,登录工作正常(使用 Spring Security 制作)。我还创建了一个“注册”页面,在那里,我需要具有请求范围的“用户”bean 在数据库“#{newUser.}”中创建一个新用户。我在一个方法里面放了一个断点,当应用程序停在那里的时候,这个对象的所有属性都为null,应用程序抛出了一个NullPointerException。
2。 从 Users.java 中移除注解“ManagedBean”和“SessionsScoped”,并在 faces-config.xml 中声明 2 个托管 bean:
<managed-bean>
<managed-bean-name>currentUser</managed-bean-name>
<managed-bean-class>ro.telacad.model.Users</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>newUser</managed-bean-name>
<managed-bean-class>ro.telacad.model.Users</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
当然,这次我在登录页面和欢迎页面“#{currentUser.}”中使用。这一次,在两种情况下(登录和注册)都会抛出 NullPointerException。
文件 faces-config.xml 已加载。我通过创建一个具有 1 个属性和 1 个方法的类 TempBean.java 对此进行了测试,在 faces-config.xml 中声明了此类的托管 bean,并在 h:form 中使用它。它奏效了。
【问题讨论】:
-
填写 bean 字段的人可能指的是名为
users的 bean?为什么需要这种模式? -
如果spring可以忽略,为什么要加它或者加标签呢?在一个类上同时使用 spring 和 jsf 注释是不好的做法(甚至会导致问题)
-
这是一个个人应用程序,我想在这里学习borh JSF和Spring。所以我是他们两个的初学者。
-
在这种情况下学习使用 CDI 会很容易。
-
您可能想要创建两个新类
extend Users类。它们都可以使用注释成为任意范围和名称的托管 bean。此外,两者都可以有自己的 @PostConstruct 方法来初始化它们的状态。
标签: jsf managed-bean