ContactsBean
@Named(value = "contactsBean")
@SessionScoped
public class ContactsBean implements Serializable {
@EJB
ContactsFacade contactsEJB;
private List<Contacts> contacts = new ArrayList<Contacts>();
@Inject
DetailsBean detailsBean;
详细信息Bean
@Named(value = "detailsBean")
@RequestScoped
public class DetailsBean {
@EJB
ContactsFacade contactsEJB;
private Contacts detailsContact = new Contacts();
我不能这样做。每当我在详细信息bean中调用EJB时,它都会抛出EJB异常。
违反了Bean验证限制 执行自动Bean时 验证回调 事件: 'prePersist'
任何想法的家伙?感谢
好的,所以我发现使用requestScoped bean似乎导致了这个问题。这是为什么?
答案 0 :(得分:1)
ContactsBean是会话范围的,DetailsBean是请求范围的。您不能将请求范围bean注入到会话范围的bean中。
同样,您不能将会话范围的bean注入应用程序作用域,依此类推。
答案 1 :(得分:1)
在构造bean之后直接进行注入。会话范围bean每个会话只构造一次。会话范围比请求范围更广。一个会话中可以有多个请求。当此时有多个请求时,注入器将不知道它必须注入哪个请求范围。甚至可能根本没有要求。
要将一个注入另一个,接受器必须与注入的对象具有相同或更窄的范围。在请求范围的bean中注入会话范围的bean将起作用。我建议你采取这条路线。
与具体问题无关,我也建议重新考虑EJB方法。你真的需要将相同的 @EJB
放在已经相互了解的两个bean上吗?我建议从ContactsFacade
中移除DetailsBean
,然后让DetailsBean
将作业委托给ContactsBean
。