2015-05-20 11 views
10

In einer Java EE 6 Anwendung auf Glassfish (3.1.2.2b5) an, dass Sie ein ConfigurationService haben, die einige Eigenschaften von Dateien und austeilt Eigenschaftswerte entsprechend lautet:Inject EJB in Eclipse SessionCustomizer bietet Oracle Schemanamen

@Local 
public interface ConfigurationService { ... } 

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

Es gibt auch einen Eclipse SessionCustomizer, weil der Schemaname einer der Persistenzeinheiten (Oracle-Datenbank) in der Anwendung programmatisch festgelegt werden muss, das heißt von den Eigenschaften Dateien bereits erwähnt konfigurierbar sein. Die SessionCustomizer konfiguriert ist, in einem persistence.xml und die Implementierung enthält einen Verweis auf die 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()); 
     ... 

Ist es möglich, die ConfigurationService derart injiziert haben, so dass es verfügbar ist, wenn die SessionCustomizer wird instanziiert? Obiges ist fehlgeschlagen, da die ConfigurationService Instanz immer noch Null ist, d. H. Die Injektion ist noch nicht erfolgt. Diese Beobachtung entspricht den Protokolleinträgen des Servers. Es scheint, dass der Mechanismus der Abhängigkeitsinjektion unveränderlich gestartet wird, nachdem die Persistenzeinheiten - und somit die SessionCustomizer - instatiziert sind. Ich habe mich mit verschiedenen Anmerkungen (@Startup, @DependsOn(...), ...) herumgeschlagen, aber ohne Erfolg. Ist meine Schlussfolgerung richtig oder gibt es einen anderen Weg, die EJB früher instanziiert und injiziert zu bekommen?

Antwort

2

Da der Sitzungs-Customizer von EclipseLink erstellt wird (nicht von Ihrem Container), ist der Container nicht für das Injizieren der Abhängigkeiten verantwortlich.

Verwenden Sie JNDI-Lookup.

+0

Ein Codebeispiel finden Sie hier: http://stackoverflow.com/a/28971109/3375325 – lazlev