2012-05-02 17 views
7

En un proyecto de Java EE 6 en el que estoy trabajando, hay un campo solitario anotado con @EJB que no se está inyectando. La inyección funciona bien en todos lados.Inyección de Java EE 6 en la clase abstracta

Siendo nuevo en Java EE, no sé si está relacionado con que el campo esté en una clase abstracta, ni puedo encontrar ningún resultado de Glassfish (3.1.2) acerca de por qué esta inyección no está ocurriendo.

No hay errores o advertencias en el registro del servidor hasta que se produzca la excepción NullPointerException porque el campo dataSourceControl es nulo. He verificado que DataSourceControl Singleton está siendo instanciado al poner logging en su constructor.

Por lo que puedo decir, el campo dataSourceControl no se está inyectando, pero los registros no me dan ninguna razón para esto.

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

¿Hay alguna regla que haya omitido con respecto a la inyección que se define en una clase abstracta?

¿Algo más que llora 'noob'?

Si no hay errores obvios, ¿alguna idea sobre cómo depurar esto?

+0

Esto debería funcionar SI obtiene una instancia de 'CountryMap' del contenedor (es decir, inyección o búsqueda) en lugar de hacerlo a través de' new CountryMap'. ¿Cómo está obteniendo una instancia de 'CountryMap'? –

+0

¡bkail, lo resolvió! Seguí mi código en la otra dirección y mis clases CountryMap (y otras clases de Map) fueron creadas manualmente. –

+0

@bkail ¿puede por favor publicar una respuesta para que pueda marcarla como correcta? Gracias. –

Respuesta

11

La inyección funcionará en cualquier clase (clase base, superclase, superclase abstracta, etc.). Sin embargo, la inyección solo funcionará siempre que obtenga una instancia de CountryMap del contenedor (es decir, inyección o búsqueda) en lugar de a través de new CountryMap. ¿Cómo está obteniendo una instancia de CountryMap?

+0

En resumen: Inyección definida en clases abstractas es posible. No haga lo que hice e instale manualmente un bean, porque entonces la instancia no se administra en contenedor y no se producirá la inyección. –

0

La inyección funciona bien en todos lados.

Como el contenedor es responsable de la inyección en clases administradas, la anotación @EJB no funcionará con clases abstractas. Tienes que buscar manualmente EJB a través de JNDI.

+1

Esto es levemente engañoso. La anotación debería funcionar en cualquier clase (clase base, superclase, superclase abstracta, etc.), pero tiene razón en que solo funcionará si la instancia se obtiene del contenedor. –

+1

Esto es lo que pensé al principio también, y otros han sugerido lo mismo, pero hasta donde yo sé, esto no debería importar ya que la herencia trae la anotación a la clase concreta. Gracias a bkail, ahora sé que puedes inyectarte en la clase abstracta, pero hubo una interrupción en la inyección instanciando manualmente la clase CountryMap. –

+0

@bkail Gracias por aclarar más. –

Cuestiones relacionadas