Java 为什么可以';注入2个EJB';将s插入相互注入的两个不同的托管bean中?

Java 为什么可以';注入2个EJB';将s插入相互注入的两个不同的托管bean中?,java,jsf,jsf-2,java-ee-6,Java,Jsf,Jsf 2,Java Ee 6,联系人Bean @Named(value = "contactsBean") @SessionScoped public class ContactsBean implements Serializable { @EJB ContactsFacade contactsEJB; private List<Contacts> contacts = new ArrayList<Contacts>(); @Inject Detail

联系人Bean

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

    @EJB
    ContactsFacade contactsEJB;
    private List<Contacts> contacts = new ArrayList<Contacts>();
    @Inject
    DetailsBean detailsBean;
我不能这样做。每当我在细节中调用EJB bean时,它就会抛出EJB异常

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

有什么想法吗,伙计们?谢谢

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

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


类似地,您不能将会话范围的bean注入到应用程序范围内,以此类推。

注入直接发生在bean构造之后。会话作用域bean在每个会话中只构造一次。会话范围比请求范围更广。一个会话中可以有多个请求。当此时有多个请求时,注入器不知道必须注入哪个请求范围内的请求。甚至可能根本没有要求

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



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

尽管如此,这还是很奇怪。我不能将EJB注入到请求范围的bean中。我把照片上的一切都拿走了。我一换成SessionScoped就行了。这是否与无状态和有状态EJB有关?谢谢。可能与CDI有关。我不知道这是怎么回事。我只使用
javax.faces.bean
注释。但是你为什么不只把它注入
ContactsBean
中,让
DetailsBean
将任务委托给
ContactsBean
或者通过一个
ContactsBean
的获取者抓取
ContactsFacade
?我将在几分钟后尝试。主要的问题是我真的需要一个requestScoped bean,而此时我只能处理sessionScoped。我以为javax.faces.bean最终会被弃用,它会被其他注释取代?不久前我读了一篇关于它的文章。不推荐?胡说这也是JavaEE6最新引入的。您可以使用JSF2注释或JEE6CDI注释。使用JSF2注释的优点是,您的JSF2应用程序能够在没有CDI(如ApacheTomcat)的纯JSP/Servlet容器上运行。JEE6 CDI的优点是,您可以在Glassfish等JEE6容器上将它与支持它的其他框架(如Spring、Hibernate等)交织在一起。我发现它一直在抛出EJB异常,因为我尝试更新的实体为空。我猜它是空的,因为请求范围,它不记得它的状态。
    @Named(value = "detailsBean")
@RequestScoped
public class DetailsBean {

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