首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将实体注入ViewScoped Bean

将实体注入ViewScoped Bean
EN

Stack Overflow用户
提问于 2011-06-14 12:24:58
回答 3查看 4.1K关注 0票数 1

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

代码语言:javascript
复制
@Stateful
@Named @javax.faces.bean.SessionScoped
public class UserBean implements Serializable
{
    @Named
    private MyUser user;

    //setter and getter
    //@PostConstruct
}

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

代码语言:javascript
复制
@Named @javax.faces.bean.ViewScoped
public class TestBean implements Serializable
{       
    @Inject private MyUser user;
}

我希望当前(登录)的MyUser user在其他几个bean中可用,但我不知道如何做到这一点。简单地说,@Inject不起作用(我很确定这对简单来说只是一点点)。

代码语言:javascript
复制
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风格的代码似乎已经过时了!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-15 08:36:59

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

根据这个定义,JPA实体是技术上被管理的bean。然而,实体有自己的特殊生命周期、状态和身份模型,通常是通过JPA或使用new实例化的。因此,我们不建议直接注入实体类。我们特别建议不要将@依赖的作用域分配给实体类,因为JPA无法持久化注入的CDI代理。

详情请参见这里

要回答您的问题:您不能“弹出”类似于(经过身份验证的)用户的东西,即使这在Seam 2中是可能的,但是CDI的整个代理机制不再允许这样做。您需要做的是:

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

按以下方式注入用户:

代码语言:javascript
复制
@Inject
@LoggedIn
private User user

这就是CDI的方式;-)

票数 4
EN

Stack Overflow用户

发布于 2011-06-14 12:37:33

@也是一个名为bean的@名称吗?

如果是的话,MyUser bean的作用域比TestBean要小。请记住,@ViewScoped bean的托管属性必须为@ViewScoped、@SessionScoped或@ApplicationScoped

票数 0
EN

Stack Overflow用户

发布于 2011-06-14 12:38:01

CDI没有指定@ViewScoped注释。这是一个JSF2注释。唯一允许的注释是:@RequestScoped@SessionScoped@ApplicationScoped@Dependent@ConversationScoped。前三个是CDI允许的唯一JSF作用域。

如果您需要支持@ViewScope注释,则需要自己编写它。幸运的是以前也有人这样做过

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6343416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档