为什么我不能将2个EJB注入到彼此注入的2个不同的托管bean中?

时间:2011-02-11 00:01:25

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

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似乎导致了这个问题。这是为什么?

2 个答案:

答案 0 :(得分:1)

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

同样,您不能将会话范围的bean注入应用程序作用域,依此类推。

答案 1 :(得分:1)

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

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


与具体问题无关,我也建议重新考虑EJB方法。你真的需要将相同的 @EJB放在已经相互了解的两个bean上吗?我建议从ContactsFacade中移除DetailsBean,然后让DetailsBean将作业委托给ContactsBean