将实体注入ViewScoped Bean

时间:2011-06-14 12:24:58

标签: java cdi jboss-weld

我是CDI的新手,想将它用于JSF2应用程序。类MyUser是一个简单的@Entity - Bean,并且在bean的@PostConstruct方法中创建了一个对象:

@Stateful
@Named @javax.faces.bean.SessionScoped
public class UserBean implements Serializable
{
    @Named
    private MyUser user;

    //setter and getter
    //@PostConstruct
}

在JSF页面中访问用户就像魅力一样:#{user.lastName}。但是现在我想从其他bean访问这个对象,例如在此@ViewScopedBean

@Named @javax.faces.bean.ViewScoped
public class TestBean implements Serializable
{       
    @Inject private MyUser user;
}

我希望当前(已登录)MyUser user可用于其他几个bean,但我不知道如何执行此操作。简单地@Inject它不起作用(而且我很确定这对于简单来说是一点点)。

13:56:22,371 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController]
Error installing to Start: name=vfs:///Applications/Development/
jboss-6.0.0.Final/server/default/deploy/test.ear_WeldBootstrapBean state=Create:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied
dependencies for type [MyUser] with qualifiers [@Default] at injection
point [[field] @Inject private test.controller.mbean.TestBean.user]

从其他bean访问user的最佳方法是什么?像UserBean bean = (UserBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("UserBean");这样的JSF1.2样式代码似乎过时了!

3 个答案:

答案 0 :(得分:4)

首先:您不想直接注入实体。实体由ORM框架独立控制,并具有自己的生命周期。不要将它们用作托管bean。

  

根据这个定义,JPA   实体是技术管理的   豆子。但是,实体有他们的   拥有特殊的生命周期,状态和   身份模型通常是   由JPA实例化或使用新的。   因此我们不建议直接使用   注入实体类。我们   特别推荐不要分配   @Dependent以外的范围   实体类,因为JPA不能   坚持注入CDI代理。

有关详细信息,请参阅here

回答你的问题:你不能像“认证的”用户那样“出局”,即使在Seam 2中这是可能的,CDI的整个代理机制也不允许这样做。您需要做的是:

  • 编写一个托管bean来处理身份验证并将其放在正确的范围内(可能是会话范围)。
  • 如果登录成功,请使用此bean的属性来存储经过身份验证的用户。
  • 使用生产者方法(可能使用@LoggedIn等限定符)使用户可以在您的应用程序中使用

像这样注入用户:

@Inject
@LoggedIn
private User user

这是CDI方式; - )

答案 1 :(得分:0)

@Inject ed bean也是@Named bean吗?

如果是,则MyUser bean的范围小于TestBean。请记住,@ ViewScoped bean的托管属性必须是@ViewScoped,@ SessionScoped或@ApplicationScoped

答案 2 :(得分:0)

CDI未指定@ViewScoped注释。这是一个JSF2注释。唯一允许的注释包括:@RequestScoped@SessionScoped@ApplicationScoped@Dependent@ConversationScoped。前三个是CDI允许的唯一JSF范围。

如果您需要支持@ViewScope注释,则需要自己编写。幸运的是,someone else has done this before