2011-12-24 8 views
16

Tôi có một EJB (PersonManager) trong modul ứng dụng doanh nghiệp, trong đó tiêm một EJB (Person):JSF managed-bean EJB tiêm

@Stateful 
public class PersonManager implements PersonManagerLocal { 
    @EJB 
    private PersonLocal person; 

    @Override 
    public void setPersonName(String name) { 
     person.setName(name); 
    } 

    @Override 
    public String getPersonName() { 
     return person.getName(); 
    } 
} 

Tôi muốn sử dụng PersonManager EJB trong một ứng dụng web JSF. Tôi định nghĩa nó trong 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> 

Vấn đề ở chỗ, việc tiêm PersonLocal EJB không xảy ra. Thuộc tính person luôn là NULL. Tôi đã làm gì sai?

Nhưng nếu tôi tiêm PersonManager trong một bean JSF được quản lý như thế này:

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

IT WORKS. Tôi cần kịch bản đầu tiên, vui lòng giúp tôi :-D

+0

Tại sao bạn không sử dụng @EJB chú thích thay vì bằng tay khai báo nó trong faces-config.xml ?? Nó giống như cố gắng để trở lại quá khứ khi chú thích không được phát minh: P –

+0

Bạn đúng :-D nó chỉ là lý thuyết, tôi muốn biết câu trả lời. – Forty

+0

@Forty Vậy tại sao nó không hoạt động? Câu trả lời không rõ ràng với tôi. –

Trả lời

37

Bạn đang trộn trách nhiệm của các hạt EJB và JSF được quản lý. faces-config.xml chỉ đăng ký các tạo phẩm JSF, chẳng hạn như các bean được quản lý chứ không phải các EJB. đăng ký của bạn trong 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> 

làm về cơ bản giống hệt như

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

Nói cách khác, bạn đăng ký lớp như một JSF quản lý đậu trong đó có sẵn trong quan điểm của #{personManager}. Điều này không đại diện cho cùng một cá thể như được quản lý bởi vùng chứa EJB. Bạn có thể và nên không sử dụng faces-config.xml để đăng ký EJB. Ở đó, bạn sử dụng chú thích từ gói javax.ejb cho, chẳng hạn như @Stateless@Stateful. Đó là tất cả những gì bạn cần để đăng ký một EJB.

Thực ra, đăng ký các hạt được quản lý JSF trong faces-config.xml là cách JSF 1.x cũ có trong JSF 2.x được thay thế bằng chú thích @ManagedBean mới.


Cập nhật cách tiếp cận thích hợp sẽ là:

View (file Facelets):

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

Controller (JSF quản lý đậu):

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

    // ... 
} 

mẫu (thực thể JPA):

@Entity 
public class Person implements Serializable { 

    @Id 
    private Long id; 

    private String name; 

    // ... 
} 

Service (EJB stateless):

@Stateless 
public class PersonService { 

    @PersistenceContext 
    private EntityManager em; 

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

    // ... 
} 
+0

Cảm ơn, Trình quản lý nhân sự là một EJB kinh doanh, do đó không chứa chú thích @ManagedBean. Nó được tạo ra bởi công cụ JSF, chỉ không tiêm EJB người vào nó, trong kịch bản faces-config. – Forty

+0

Tôi biết EJB là gì và chúng được sử dụng như thế nào. Bạn có? Phần nào chính xác bây giờ vẫn chưa rõ ràng? – BalusC

+4

Xin lưu ý rằng '@ Stateful' bị thiếu trong ví dụ trả lời của tôi. Đó là ** không phải là một EJB theo cách này. Bạn đang cố gắng lạm dụng EJB như một bean được quản lý JSF. Điều này không chính xác. Về cơ bản, bạn nên có 1 tệp XHTML là dạng xem, 1 JSF được quản lý bean làm Bộ điều khiển, 1 thực thể làm Mô hình và 1 EJB làm dịch vụ. Trong câu hỏi của bạn, 'PersonManager' phải là một bean được quản lý JSF, không phải là một EJB. 'PersonLocal' có vẻ quá nhiều thực thể, không phải là một EJB. Vì vậy, tôi nghi ngờ nếu nó thực sự cần phải là một EJB. EJB có ý định cung cấp các dịch vụ như 'create()', 'save()', v.v. – BalusC