2012-05-02 40 views
7

Trong một dự án Java EE 6 tôi đang làm việc trên, có một trường đơn độc được chú thích bằng @EJB không được tiêm. Tiêm đang hoạt động tốt ở mọi nơi khác.Java EE 6 Injection vào lớp trừu tượng

Là người mới sử dụng Java EE, tôi không biết liệu nó có liên quan đến lĩnh vực đang trong lớp trừu tượng hay không, tôi cũng không thể tìm thấy bất kỳ đầu ra nào từ Glassfish (3.1.2) về lý do tại sao việc tiêm này không xảy ra.

Không có lỗi hoặc cảnh báo trong nhật ký máy chủ cho đến khi NullPointerException xảy ra vì trường dataSourceControl là rỗng. Tôi đã xác minh rằng DataSourceControl Singleton đang được khởi tạo bằng cách đặt đăng nhập vào hàm tạo của nó.

Theo như tôi có thể nói, trường dataSourceControl không được tiêm, nhưng nhật ký cho tôi không có lý do tại sao điều này xảy ra.

public abstract class AbstractDataMap<T> { 
    @EJB 
    private DataSourceControl dataSourceControl; // This is not being injected 

    DataSourceControl getDataSourceControl() { 
    return dataSourceControl; 
    } 
    // Other methods 
} 

public abstract class AbstractDataMapDBProd<T> extends AbstractDataMap<T> { 
    @Override 
    protected Connection getDBConnection() { 
    return getDataSourceControl().getConnectionX(); // NullPointerException here 
    } 
    // Other methods 
} 

@Stateless 
public class CountryMap extends AbstractDataMapDBProd<Country> { 
    public boolean update(final Country current, final Country legacy) { 
    Connection connection = getDBConnection(); 
    // More code 'n stuff 
    } 
} 

Có bất kỳ quy tắc nào tôi đã bỏ lỡ về việc tiêm được xác định trong lớp trừu tượng không?

Bất cứ điều gì khác mà khóc 'noob'?

Nếu không có lỗi rõ ràng, bất kỳ ý tưởng nào về cách gỡ lỗi này?

+0

Điều này sẽ hoạt động NẾU bạn có được một ví dụ về 'Bản đồ quốc gia 'từ vùng chứa (ví dụ: tiêm hoặc tra cứu) thay vì thông qua' Bản đồ quốc gia mới '. Làm thế nào bạn có được một ví dụ của 'CountryMap'? –

+0

bkail, bạn đã giải quyết nó! Tôi theo mã của tôi trở lại theo một hướng khác và các lớp CountryMap (và các Bản đồ khác) của tôi đã được khởi tạo thủ công. –

+0

@ bkail bạn có thể vui lòng gửi câu trả lời của bạn một câu trả lời để tôi có thể đánh dấu nó là chính xác không? Cảm ơn. –

Trả lời

11

Tiêm sẽ hoạt động trong bất kỳ lớp nào (lớp cơ sở, siêu lớp, siêu lớp trừu tượng, v.v.). Tuy nhiên, quá trình tiêm sẽ chỉ hoạt động miễn là bạn có được một phiên bản của CountryMap từ vùng chứa (ví dụ: tiêm hoặc tra cứu) thay vì thông qua new CountryMap. Làm thế nào bạn có được một thể hiện của CountryMap?

+0

Tóm lại: Tiêm được xác định trong các lớp trừu tượng là có thể. Đừng làm những gì tôi đã làm và tự khởi tạo một bean, bởi vì sau đó instance không phải là container được quản lý và việc tiêm sẽ không xảy ra. –

0

Tiêm đang hoạt động tốt ở mọi nơi khác.

Vì vùng chứa chịu trách nhiệm cho việc tiêm trong các lớp được quản lý, chú thích @EJB sẽ không hoạt động với các lớp trừu tượng. Bạn phải tự tra cứu EJB thông qua JNDI.

+1

Điều này hơi gây hiểu nhầm. Chú thích sẽ hoạt động trong bất kỳ lớp nào (lớp cơ sở, siêu lớp, siêu lớp trừu tượng, v.v.), nhưng bạn nói đúng là nó sẽ chỉ hoạt động nếu cá thể đó được lấy từ vùng chứa. –

+1

Đây là những gì tôi nghĩ lúc đầu, và những người khác đã đề xuất như vậy, nhưng theo như tôi biết điều này không quan trọng như thừa kế mang lại chú thích cho lớp bê tông. Nhờ bkail, bây giờ tôi biết rằng bạn có thể tiêm trong lớp trừu tượng, nhưng đã có một break trong tiêm bằng cách instantiating lớp CountryMap. –

+0

@bkail Cảm ơn bạn đã làm rõ thêm. –

Các vấn đề liên quan