2016-06-14 9 views
1

Ich versuche herauszufinden, die beste Möglichkeit zum Definieren von Remote EJB 3 Beans in Spring 4.x mit JavaConfig (Annotation-basierte Konfiguration) .So definieren Sie Remote EJBs Beans im Frühling mit Annotation-basierten Konfiguration (zB: JavaConfig)

Ich habe am Spring Docs for <jee:remote-slsb> geschaut und haben zusammen eine funktionale Konfiguration gehackt, aber es ist schrecklich:

@Bean 
public LoginManager getLoginManager(){ 
    SimpleRemoteStatelessSessionProxyFactoryBean factory = new SimpleRemoteStatelessSessionProxyFactoryBean(); 
    String beanName = "jndi.ejb3.LoginManager"; 
    factory.setJndiName(beanName); 
    factory.setBusinessInterface(LoginManager.class); 
    Properties p = new Properties(); 
    p.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
    p.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); 
    p.setProperty("java.naming.provider.url", "jnp:localhost:1099"); 
    factory.setJndiEnvironment(p); 
    try { 
     factory.afterPropertiesSet(); 
    } catch (NamingException e1) { 
     e1.printStackTrace(); 
    } 
    return (LoginManager) factory.getObject(); 
} 

ich nicht afterPropertiesSet() in der Bean-Definition sollte anrufen, und ich würde das erwarten die getObject() sollte automatisch von Spring aufgerufen werden. Darüber hinaus bedeutet es auch, die Factory für jeden Remote EJB zu definieren, den ich laden möchte, was nicht richtig erscheint. Ich hätte mir gewünscht/erwartet, dass ich eine wiederverwendbare Fabrik definieren und einfach den Interface/JNDI-Namen für jede Bean-Erstellung übergeben könnte, aber das funktioniert nicht.

Die spring docs zeigen:

Auch mit @Bean Methoden, werden Sie in der Regel wählen programmatische JNDI-Lookups verwenden: entweder mit Spring JndiTemplate/JndiLocatorDelegate Helfer oder gerade JNDI Initial Nutzung, aber nicht die JndiObjectFactoryBean-Variante, die Sie zwingen würde, den Rückgabetyp als FactoryBean-Typ anstelle des tatsächlichen Zieltyps zu deklarieren, so dass es schwieriger für Querverweisaufrufe in anderen @Bean-Methoden, die aufbeziehen wollen 10 die hier zur Verfügung gestellte Ressource.

So jetzt bin ich verwirrt, was zu tun ist.

Die EJB Specific spring docs empfehlen auch die SimpleRemoteStatelessSessionProxyFactoryBean mit:

definieren explizit <jee:local-slsb>/<jee:remote-slsb> Lookups einfach konsistente und explizite EJB Zugriffskonfiguration zur Verfügung stellt.

Also wie mache ich das sauber?

Antwort

1

Sie müssen die afterProperties-Methode nicht explizit aufrufen, da dies Teil des Spring Bean-Lebenszyklus ist. Wenn Sie die Bean als Factory-Bean deklarieren, verwendet spring automatisch das getObject, um das reale Objekt bei Bedarf zu erhalten. Hier ist der modifizierte Code

@Bean 
public FactoryBean getLoginManagerFactory(){ 
    SimpleRemoteStatelessSessionProxyFactoryBean factory = new SimpleRemoteStatelessSessionProxyFactoryBean(); 
    String beanName = "jndi.ejb3.LoginManager"; 
    factory.setJndiName(beanName); 
    factory.setBusinessInterface(LoginManager.class); 
    Properties p = new Properties(); 
    p.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
    p.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); 
    p.setProperty("java.naming.provider.url", "jnp:localhost:1099"); 
    factory.setJndiEnvironment(p); 
return factory; 
} 
+0

zusätzlich können Sie Ihre Eigenschaften injizieren, wenn Sie diese externalisieren möchten. – Pierre

Verwandte Themen