2011-02-11 4 views
2

ContactsBean2 개의 서로 다른 관리 빈에 2 개의 EJB를 주입 할 수없는 이유는 무엇입니까?

@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(); 

나는이 작업을 수행 할 수 없습니다. 세부 빈에서 EJB를 호출 할 때마다 EJB 예외가 발생합니다. 'prePersist'

모든 아이디어들 : 콜백 이벤트에 자동 콩 검증을 실행하는 동안

콩 검증 제약 (들) 을 위반? 감사합니다

** 확인

그래서 나는 requestScoped 콩을 사용하여이 문제를 일으키는 것 같다 발견 ** UPDATE. 왜 이런거야?

답변

1

주사는 콩의 건설 직후에 발생합니다. 세션 범위 콩은 세션 당 한 번만 생성됩니다. 세션 범위는 요청 범위보다 넓습니다. 한 세션 내에 여러 요청이있을 수 있습니다. 인젝터는 현재 여러 요청이있을 때 어떤 요청 범위를 요구했는지 알 수 없습니다. 요청이 전혀 없을 수도 있습니다.

다른쪽에 하나를 삽입하려면 수락자가 삽입 된 개체와 같거나 좁은 범위에 있어야합니다. 요청 범위 Bean에서 세션 범위 Bean을 주입하면 작동합니다. 대신이 길을 선택하는 것이 좋습니다.


구체적인 문제와 관련이 없으므로 EJB 접근법도 다시 생각해 보시기 바랍니다. 같은@EJB을 서로에 대해 이미 알고있는 두 개의 콩에 넣어야합니까? DetailsBean에서 ContactsFacade을 제거하고 DetailsBeanContactsBean에 작업을 위임하게하십시오.

+0

항상 훌륭한 답변입니다. –

+0

반갑습니다. – BalusC

+0

그래도 여전히 이상합니다. RequestScoped 빈에 EJB를 삽입 할 수 없습니다. 나는 모든 것을 그림에서 빼냈다. 곧 SessionScoped로 변경하면됩니다. 이것은 Stateless 및 Stateful EJB와 관련이 있습니까? 감사. –

1

ContactsBean은 세션 범위이며 DetailsBean은 요청 범위입니다. 요청 범위 Bean을 세션 | 위 Bean에 삽입 할 수 없습니다.

마찬가지로 세션 범위의 Bean을 응용 프로그램 범위에 삽입 할 수는 없습니다.

관련 문제