我是CDI的新手,希望将其用于JSF2应用程序。类MyUser
是一个简单的@Entity
-Bean和对象是在@PostConstruct
方法豆创建:将实体注入到ViewScoped Bean中
@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
是在其他几个豆可用,但我不知道如何做到这一点。只是@Inject
它没有工作(我敢肯定,这将是简单 litte位)。
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
的最佳方法是什么?似乎UserBean bean = (UserBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("UserBean");
似乎是老式的JSF1.2风格代码!
谢谢你的回答,帮助我理解CDI。通过您提供的关键字,我还发现了这个http://www.oracle.com/technetwork/articles/javaee/javaee6overview-141808.html,它的工作方式与您的示例类似。我唯一想知道的是'@ LoggedIn'注释。它不能在这里解决! '@ Poduces'解析为'javax.enterprise.inject.Produces'。 – Thor 2011-06-15 11:13:23
@LoggedIn是一个限定符 - 你自己的注释:-)。这就是类型安全在CDI中的工作原理:只要有多于一个特定类型的bean(比如User),就需要告诉容器哪个用户要注入 - 并且这是通过限定符实现的。详情请参阅:http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1217 – 2011-06-15 18:03:26