2011-12-24 4 views
16

나는 다른 EJB (사람을) 주입 엔터프라이즈 응용 프로그램 MODUL의 EJB (PersonManager)를 가지고있다. 나는 얼굴-config.xml 파일에서 정의 :JSF 관리 - 콩 EJB 주입

<managed-bean> 
    <managed-bean-name>personManager</managed-bean-name> 
    <managed-bean-class>ejb.PersonManager</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

문제는 PersonLocal EJB의 주입이 발생하지 않는 것입니다. person 특성은 항상 NULL입니다. 내가 뭘 잘못 했니?

하지만이 같은 JSF 관리 빈에서 PersonManager을 주입하는 경우 :

IT 작동
@ManagedBean 
@RequestScoped 
public class Index { 
    @EJB 
    private PersonManagerLocal personManager; 
    .... 

. 첫 번째 시나리오가 필요합니다 .-D

+0

왜 얼굴-config.xml 파일에 선언하는 대신 수동으로 @EJB 주석을 사용하지 않는 ?? 주석이 발명되지 않은 과거로 되돌아 가려고하는 것과 같습니다 : P –

+0

당신이 옳습니다 :- 단지 이론적 인 말입니다. 나는 답을 알고 싶습니다. – Forty

+0

@ Forty 그럼 왜 작동하지 않습니까? 대답은 분명하지 않습니다. –

답변

37

EJB 및 JSF 관리 Bean의 책임이 혼합되어 있습니다. faces-config.xml은 EJB가 아닌 관리 Bean과 같은 JSF 아티팩트 만 등록합니다. faces-config.xml

<managed-bean> 
    <managed-bean-name>personManager</managed-bean-name> 
    <managed-bean-class>ejb.PersonManager</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

의 등록은 기본적으로 동일 즉

@ManagedBean 
@SessionScoped 
public class PersonManager { 
    // ... 
} 

으로 JSF가 #{personManager}에 의해 뷰에서 볼 수 있습니다 콩 관리, 당신은 클래스를 등록하고한다. 이것은 EJB 컨테이너가 관리하는 것과 동일한 인스턴스를 나타내지 않습니다. 아니요 faces-config.xml을 사용하면 EJB를 등록 할 수 있습니다. 여기서 패키지의 주석 (예 : @Stateless@Stateful)을 사용합니다. EJB를 등록하기 만하면됩니다.

사실, 등록 JSF는 faces-config.xml에 콩 관리는 새로운 @ManagedBean 주석으로 대체되었습니다 JSF 2.x에서에있는 오래된 JSF 1.x에서 방법입니다.


업데이트 적절한 접근 방법은 다음과 같습니다

보기합니다 (Facelets의 파일) :

<h:form> 
    <h:inputText value="#{personManager.person.name}" /> 
    ... 
    <h:commandButton value="Save" action="#{personManager.save}" /> 
    <h:messages /> 
</h:form> 

컨트롤러합니다 (JSF가 관리 Bean) :

@ManagedBean 
@ViewScoped 
public class PersonManager implements Serializable { 

    private Person person; 

    @EJB 
    private PersonService personService; 

    @PostConstruct 
    public void init() { 
     person = new Person(); 
    } 

    public void save() { 
     personService.create(person); 
     FacesContext.getCurrentInstance().addMessage(null, 
      new FacesMessage("Person successfully created, new ID is " + person.getId())); 
    } 

    // ... 
} 

모델 (JPA 엔티티) :

@Entity 
public class Person implements Serializable { 

    @Id 
    private Long id; 

    private String name; 

    // ... 
} 

서비스 (상태 비 EJB) :

@Stateless 
public class PersonService { 

    @PersistenceContext 
    private EntityManager em; 

    public void create(Person person) { 
     em.persist(person); 
    } 

    // ... 
} 
+0

감사합니다. PersonManager는 비즈니스 EJB이므로 @ManagedBean 주석을 포함하지 않습니다. JSF 엔진에 의해 생성되고, faces-config 시나리오에 따라 사람 EJB가 삽입되지 않습니다. – Forty

+0

EJB가 무엇이고 어떻게 사용되는지 알고 있습니다. 너? 지금 정확히 어떤 부분이 아직 불분명합니까? – BalusC

+4

제 답안에'@ Stateful'이 없습니다. 이런 식으로 ** EJB가 아닙니다 **. EJB를 JSF 관리 빈으로 남용하려고 시도했다. 이것은 옳지 않다. 기본적으로 뷰로 1 개의 XHTML 파일, 컨트롤러로 1 JSF 관리 빈, 모델로 1 엔터티, 서비스로 1 EJB가 있어야합니다. 귀하의 질문에,'PersonManager'는 EJB가 아닌 JSF 관리 빈이어야합니다. 'PersonLocal'은 EJB가 아닌 너무 많은 엔티티로 보인다. 따라서 EJB가 실제로 필요한지는 의심 스럽습니다. EJB는'create()','save()'등과 같은 서비스를 제공하기 위해 고안되었습니다. – BalusC