2012-05-02 10 views
7

In un progetto Java EE 6 su cui sto lavorando, c'è un campo solo annotato con @EJB che non viene iniettato. L'iniezione funziona bene ovunque.Java EE 6 Iniezione in classe astratta

Essendo nuovo in Java EE, non so se è correlato al fatto che il campo sia in una classe astratta, né posso trovare alcun output da Glassfish (3.1.2) sul motivo per cui questa iniezione non si verifica.

Non ci sono errori o avvisi nel registro del server fino a quando si verifica NullPointerException perché il campo dataSourceControl è null. Ho verificato che DataSourceControl Singleton è stato istanziato inserendo il suo costruttore.

Per quanto posso dire, il campo dataSourceControl non viene iniettato, ma i registri non mi forniscono alcun motivo.

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 
    } 
} 

Ci sono delle regole che mi sono sfuggite per quanto riguarda l'iniezione definita in una classe astratta?

Qualcos'altro che grida "noob"?

Se non ci sono errori evidenti, qualche idea su come eseguire il debug di questo?

+0

Questo dovrebbe funzionare SE si ottiene un'istanza di 'CountryMap' dal contenitore (vale a dire, iniezione o ricerca) piuttosto che tramite' nuova CountryMap'. Come stai ottenendo un'istanza di 'CountryMap'? –

+0

bkail, l'hai risolto! Ho seguito il mio codice nella direzione opposta e le mie classi CountryMap (e altre mappe) venivano istanziate manualmente. –

+0

@bkail puoi postare la tua risposta in modo che io possa contrassegnarla come corretta? Grazie. –

risposta

11

L'iniezione funziona in qualsiasi classe (classe base, superclasse, superclasse astratta, ecc.). Tuttavia, l'iniezione funziona solo fino a quando si ottiene un'istanza di CountryMap dal contenitore (ad esempio, iniezione o ricerca) anziché tramite new CountryMap. Come stai ottenendo un'istanza di CountryMap?

+0

In sintesi: l'iniezione definita in classi astratte è possibile. Non fare ciò che ho fatto e istanziare manualmente un bean, perché l'istanza non è gestita dal contenitore e l'iniezione non si verificherà. –

0

Iniezione funziona bene ovunque.

Come il contenitore è responsabile per l'iniezione in classi gestite, l'annotazione @EJB non funziona con le classi astratte. Devi cercare manualmente EJB attraverso JNDI.

+1

Questo è leggermente fuorviante. L'annotazione dovrebbe funzionare in qualsiasi classe (classe base, superclasse, superclasse astratta, ecc.), Ma hai ragione che funzionerà solo se l'istanza viene ottenuta dal contenitore. –

+1

Questo è quello che pensavo anche io, e altri hanno suggerito la stessa cosa, ma per quanto ne so non dovrebbe essere importante in quanto l'ereditarietà porta l'annotazione alla classe concreta. Grazie a bkail, ora so che puoi fare l'iniezione nella classe astratta, ma c'è stata un'interruzione nell'iniezione istanziando manualmente la classe CountryMap. –

+0

@bkail Grazie per aver chiarito ulteriormente. –

Problemi correlati