2015-05-20 10 views
10

In un'applicazione Java EE 6 in esecuzione su GlassFish (3.1.2.2b5), supponiamo di avere un ConfigurationService, che legge alcuni file proprietà e le mani fuori i valori delle proprietà di conseguenza:Iniettare EJB in EclipseLink SessionCustomizer per fornire Oracle nome dello schema

@Local 
public interface ConfigurationService { ... } 

@Singleton 
public class ConfigurationServiceImpl implements ConfigurationService { ... } 

C'è anche un EclipseLink SessionCustomizer, perché il nome dello schema di una delle unità di persistenza (database Oracle) nella applicazione deve essere a livello di codice impostare, vale a dire essere configurabile dai file di proprietà di cui prima. Il SessionCustomizer è configurato in un persistence.xml e l'attuazione contiene un riferimento ConfigurationService:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"... 
    <persistence-unit name="myPU" transaction-type="JTA"> 
     <property name="eclipselink.session.customizer" value="MySessionCustomizer"/> 
     ... 

public class MySessionCustomizer implements SessionCustomizer { 
    @EJB 
    private ConfigurationService configurationService; 
    @Override 
    public void customize(Session session) { 
     session.getLogin().setTableQualifier(configurationService.getSchemaName()); 
     ... 

È possibile avere il ConfigurationService iniettata in modo tale, in modo che sia disponibile quando il SessionCustomizer è istanziato? Quanto sopra non funziona poiché l'istanza ConfigurationService è ancora nullo, ovvero l'iniezione non è ancora avvenuta. Questa osservazione corrisponde alle voci di registro del server. Sembra che il meccanismo di iniezione delle dipendenze sia invariabilmente avviato dopo che le unità di persistenza - e quindi il SessionCustomizer - sono istatate. Ho incasinato varie annotazioni (@Startup, @DependsOn(...), ...) ma senza successo. La mia conclusione è corretta o esiste un altro modo per rendere l'EJB istanziato e iniettato prima?

risposta

2

Poiché la personalizzazione della sessione viene creata da EclipseLink (non dal contenitore), il contenitore non è responsabile dell'iniezione delle dipendenze.

Utilizzare la ricerca JNDI.

+0

Un esempio di codice può essere trovato qui: http://stackoverflow.com/a/28971109/3375325 – lazlev

Problemi correlati