2011-08-23 26 views
7

Tôi đang viết một thành phần (composite) cần tương tác với DAO của tôi. Sau đây là cách phần Java được khai báo:Tiêm Tài nguyên vào UIComponent (hay còn gọi là CDI hoạt động ở đây?)

@FacesComponent(value="selectLocation") 
public class SelectLocation extends UINamingContainer { 

Để có được đối tượng DAO, tôi đã cố gắng chú thích CDI:

@Inject private LocationControl lc; 

Và điều đó không làm việc vì vậy tôi cố gắng Faces chú thích:

@ManagedProperty (value = "@{locationControl}") private LocationControl lc; 

Cả hai trường hợp không có gì xảy ra - thuộc tính lc kết thúc bằng null sau khi hàm tạo kết thúc.

Tôi sử dụng CDI trong tất cả các hạt sao lưu của mình và tất cả đều hoạt động. Điều này sẽ được sử dụng Weld bên trong GlassFish 3.1.1. Bất kỳ đề xuất về cách lấy tài nguyên?

+0

Đặng Tôi nghĩ bạn đã lên một cái gì đó - tôi đã cố gắng java.inject.Named nhưng vẫn không có niềm vui. – AlanObject

+0

Việc thêm @RequestScoped khiến ứng dụng không thể triển khai: WELD-001437 Lớp bean bình thường phạm vi javax.faces.component.UIComponent không được ủy quyền vì loại này là cuối cùng hoặc chứa phương thức cuối cùng là javax.faces.component cuối cùng công khai. TransientStateHelper javax.faces.component.UIComponent.getTransientStateHelper(). – AlanObject

+0

Thành phần được tạo cho phép người dùng chọn đối tượng Vị trí bằng cách duyệt qua cơ sở dữ liệu (JPA) của các đối tượng đó. Đối với điều đó tôi cần truy cập vào DAO trực tiếp hoặc gián tiếp. Nhưng các DAO của tôi không khác gì các bean được CDI quản lý khác của chúng tôi - chúng chỉ có các chú thích JPA bên trong chúng như là @PersistenceContext trong chúng. Tôi đang đọc đặc tả CDI ngay bây giờ để xem liệu có cái gì đó trong beans.xml có thể giúp đỡ không. – AlanObject

Trả lời

5

Tôi có một công việc xung quanh bây giờ, về cơ bản là đưa vào mã đĩa nồi hơi mà CDI và. al. được cho là sẽ bỏ đi. Bây giờ tôi có phương pháp này:

public LocationControl getLocationControl() { 
    if (lc != null) return lc; 
    FacesContext fc = getFacesContext(); 
    Object obj = fc.getApplication().evaluateExpressionGet(fc, "#{locationControl}", LocationControl.class); 
    if (obj instanceof LocationControl) lc = (LocationControl) obj; 
    return lc; 
} 

Tôi muốn biết nếu có ai có giải pháp tốt hơn.

2

Tôi không biết liệu nó có hoạt động với các thành phần hay không, nhưng với CDI + MyFaces CODI bạn có @Advanced để đánh dấu, ví dụ: Người nghe giai đoạn sẽ có thể sử dụng @Inject. Nếu nó không hoạt động, bạn có thể tạo một yêu cầu tính năng trong JIRA của họ. Chúng khá nhanh và thường xuyên có bản phát hành.

Hoặc bạn sử dụng: MyBean myBean = BeanManagerProvider.getInstance(). GetContextualReference (MyBean.class); theo cách thủ công.

2

Có cách để thực hiện tác vụ này mà không cần giải pháp?

Có, chỉ cần sử dụng hạt ủng hộ theo cách thông thường.

<x:someComponent value="#{someBean.someProperty}" /> 

Bọc nếu cần thiết trong một tagfile tái sử dụng/tổng hợp để giữ cho nó khô:

<my:someComponent /> 
Các vấn đề liên quan