Java 为什么可以';注入2个EJB';将s插入相互注入的两个不同的托管bean中?
联系人BeanJava 为什么可以';注入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
@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();