2010-01-07 5 views
12

Tôi có EJB không quốc tịch để truy cập cơ sở dữ liệu của tôi. Tôi cần hạt này trong bộ chuyển đổi JSF 2 để truy xuất đối tượng thực thể từ tham số giá trị Chuỗi. Tôi đang sử dụng JEE6 với Glassfish V3.Tiêm EJB vào bộ chuyển đổi JSF với JEE6

@EJB chú thích không hoạt động và nhận NPE, vì nó nằm trong ngữ cảnh khuôn mặt và không có quyền truy cập vào ngữ cảnh EJB.

Câu hỏi của tôi là: Vẫn có thể tiêm đậu này bằng @Resource hoặc chú thích khác hoặc tra cứu JNDI hoặc tôi có cần giải pháp không?


Giải pháp

Thực hiện tra cứu JNDI như thế này:

try { 
    ic = new InitialContext(); 
    myejb= (MyEJB) ic 
    .lookup("java:global/xxxx/MyEJB"); 
    } catch (NamingException e) { 
    e.printStackTrace(); 
    } 

Trả lời

6

tôi không bao giờ sử dụng JSF 2.0 (chỉ 1.0), nhưng chương 5.4 spec nói:

[...] cho phép vùng chứa chèn tham chiếu đến tài nguyên được quản lý vùng chứa vào một cá thể bean được quản lý trước khi nó được truy cập vào ứng dụng JSF. Chỉ đậu được khai báo là theo yêu cầu, phiên hoặc phạm vi ứng dụng là khả năng để phun tài nguyên.

Nhưng cho đến nay tôi hiểu, việc tra cứu JNDI nên thực hiện thủ thuật.

+0

tra cứu JNDI không hoạt động. Tôi đã thử @EJB (mappedName = "java: global/myProject/myEJB") trong đó giá trị là giá trị đầu ra của glassfish trong giao diện điều khiển là "tên JNDI di động" của EJB trong khi triển khai –

+2

không sử dụng chú thích @EJB. Lấy thành phần đích bằng InitialContext. – Bozho

+0

@Bozho: InitialContext đã hoạt động! :) Thankyou –

2

Giải pháp khác (nhưng không quá đẹp) có thể đang sử dụng liên kết thay vì converterId. Sử dụng JSF quản lý chỉ đậu:

< f: Chuyển đổi ràng buộc = "# {app.personConverter}"/>

đâu appBean là viết tắt của cái gì đó như: @ManagedBean(name="app") @ApplicationScoped class AppBean { @EJB private PersonService ps; private Converter personConverter; }

Có thể có một giải pháp đẹp hơn trong CDI kiểu (JSR-299), nhưng tôi đã thất bại để làm điều này một chạy:

< f: chuyển đổi ràng buộc = "# {cdiBean}"/>

đâu cidBean nên được: @Named class CdiBean implements Converter { @EJB ... }

Không với 'hành vi mặc định gọi của đòi hỏi một chuyển đổi-id thông qua trong constructor'

cách tiếp cận Nhưng dù sao đầu tiên sử dụng ràng buộc và ứng dụng scoped JSF đậu làm việc.

2

Tôi không biết liệu giải pháp này có khá hay không ...nhưng nó làm việc:

@ManagedBean 
public class AcquisitionConverter implements Converter 
{ 
    @EJB 
    private AcquisitionService service; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
    { 
     ... 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) 
    { 
     ... 
    } 
} 

<h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}"> 

với JSF 2.1.3 (cá móm) và glassfish 3.1.1

+0

Chú thích '@ FacesConverter' là cách cực kỳ trong cấu trúc này (và chỉ gây nhầm lẫn cho người mới bắt đầu). Gỡ bỏ nó. – BalusC

+0

ok, tôi đã xóa nó :) –

+0

công cụ chuyển đổi = "# {purchasedConverter}" là những thứ không hoạt động đối với tôi –