1

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

user从其他bean访问的最佳方法是什么?JSF1.2 风格的代码UserBean bean = (UserBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("UserBean");好像好像老土了!

4

3 回答 3

4

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

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

有关详细信息,请参见此处

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

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

像这样注入用户:

@Inject
@LoggedIn
private User user

这就是 CDI 方式 ;-)

于 2011-06-15T08:36:59.173 回答
0

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

如果需要支持@ViewScope注解,则需要自己编写。幸运的是,以前有人做过这件事

于 2011-06-14T12:38:01.380 回答
0

@Inject ed bean 也是 @Named bean 吗?

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

于 2011-06-14T12:37:33.787 回答