ManagedBean继承&通用名称

时间:2013-03-18 18:03:40

标签: jsf inheritance session-scope

在我们的一个应用程序中,我们有两类用户,

  1. 内部用户(class InternalUser extends User
  2. 外部用户(class ExternalUser extends User
  3. 我们使用这些作为会话范围的托管bean(基本上是注入登录用户的详细信息,其中class User中有一些共同的细节,以及上述两个类中的一些具体细节)

    我是否可以为托管bean设置相同的名称(此处为“loggedInUser”)?

    Faces抛出异常“已经注册了名为'loggedInUser'的托管bean。替换现有的托管bean类......

    我们如何管理这种情况?

2 个答案:

答案 0 :(得分:2)

一种方法是不要将它变成JSF托管bean。使与登录表单关联的bean成为请求/视图作用域,并将User实例放在会话范围内。

E.g。

User user = service.find(username, password);

if (user != null) {
    externalContext.getSessionMap().put("user", user);
}

它将在EL范围内以#{user}形式提供(因此也可以通过其他bean中的@ManagedProperty注入该表达式)。在find()方法中,您可以相应地返回InternalUserExternalUser

答案 1 :(得分:1)

也许一个名为CurrentUser的托管bean以Internal/ExternalUser为成员?在我自己的应用程序中,我不确定是否通过将User子类作为业务对象和托管bean以您尝试的方式进行双重注入所需的数据。