【问题标题】:Why can't I inject 2 EJB's into 2 different managed beans that inject each other?为什么我不能将 2 个 EJB 注入到相互注入的 2 个不同的托管 bean 中?
【发布时间】:2011-06-25 06:02:06
【问题描述】:

联系人豆

   @Named(value = "contactsBean")
@SessionScoped
public class ContactsBean implements Serializable {

    @EJB
    ContactsFacade contactsEJB;
    private List<Contacts> contacts = new ArrayList<Contacts>();
    @Inject
    DetailsBean detailsBean;

细节豆

    @Named(value = "detailsBean")
@RequestScoped
public class DetailsBean {

    @EJB
    ContactsFacade contactsEJB;
    private Contacts detailsContact = new Contacts();

我不能这样做。每当我在 details bean 中调用 EJB 时,它都会抛出 EJB 异常和这个。

违反了 Bean 验证约束 在执行自动 Bean 时 回调验证 事件:'prePersist'

有什么想法吗?谢谢

**更新**

好的,所以我发现似乎使用 requestScoped bean 会导致这个问题。这是为什么呢?

【问题讨论】:

    标签: java jsf jsf-2 java-ee-6


    【解决方案1】:

    ContactsBean 是会话范围的,DetailsBean 是请求范围的。您不能将请求范围的 bean 注入会话范围的 bean。

    同样,您不能将会话范围的 bean 注入应用程序范围的 bean,等等。

    【讨论】:

      【解决方案2】:

      在 bean 构建之后直接进行注入。每个会话只构建一次会话范围的 bean。会话范围比请求范围更广。一个会话中可以有多个请求。当当前有多个请求时,注入器不知道它必须注入哪个请求范围。甚至可能根本没有请求。

      要将一个注入另一个,接受器必须与注入的对象具有相同或更窄的范围。在请求范围的 bean 中注入会话范围的 bean 就可以了。我建议你改用这条路线。


      与具体问题无关,我还建议重新考虑 EJB 方法。你真的需要把 same @EJB 放在两个已经知道彼此的 bean 上吗?我建议从DetailsBean 中删除ContactsFacade,然后让DetailsBean 将工作委托给ContactsBean

      【讨论】:

      • 不过还是很奇怪。我无法将 EJB 注入 RequestScoped bean。我把照片里的所有东西都去掉了。当我将其更改为 SessionScoped 时,它就可以工作了。这与无状态和有状态 EJB 有关系吗?谢谢。
      • 可能与 CDI 有关。我不确定它是如何工作的。我只使用javax.faces.bean 注释。但是你为什么不只将它注入ContactsBean 并让DetailsBean 将工作委托给ContactsBean 或通过ContactsBean 的getter 获取ContactsFacade
      • 我稍后会尝试。主要问题是我真的需要一个 requestScoped bean,此时我被 sessionScoped 困住了。我认为 javax.faces.bean 最终会被弃用,它会转到其他注释吗?不久前我读过一篇关于它的文章。
      • 已弃用?废话。这也是 Java EE 6 新引入的。您可以使用 JSF2 注释或 JEE6 CDI 注释。使用 JSF2 注释的优势在于,您的 JSF2 应用程序能够在没有 CDI(如 Apache Tomcat)的纯 JSP/Servlet 容器上运行。 JEE6 CDI 的优势在于您可以将它与支持它的其他框架(如 Spring、Hibernate 等)交织在 JEE6 容器(如 Glassfish)上。
      • 我发现它一直在抛出 EJB 异常,因为我试图更新的实体为空。我猜它是 null 因为请求范围,它不记得它的状态。
      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多