wie man bind () - Objekt über jndi im Frühjahr deklarativ?
Wir haben eine einfache standalone-spring-Anwendung, und wir müssen, um jdbc-datasource im jndi. (wir verwenden jboss treecache und es müssen datasource im jndi).
Etwas googlen gefunden, die meisten von allen jndi-lookup-Beispiele mit Quelle, wo ein Objekt ist bereits in jndi (von tomcat-oder application-server, etc), aber wir brauchen etwas anderes: ich habe einen einfachen datasource-Spring-bean, die ich injizieren zu anderen Diensten, aber ich kann nicht Spritzen es TreeCache, da braucht es es nur von jndi.
Gefunden org.springframework.jndi.JndiTemplate
, die deklariert werden kann als Bohne, z.B.:
<bean id="fsJndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop>
<prop key="java.naming.provider.url">file:///c:\windows\temp</prop>
</props>
</property>
</bean>
aber nicht gefunden, wie zu binden, die mit anderen als den im java-code: fsJndiTemplate.bind(name, obj)
aus init-Methode der einige andere Bohne.
Gibt es eine Möglichkeit, es zu tun deklarativ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre können eine JndiExporter was nutzt eine JndiTemplate so binden Sie eine map-Objekt mit Namen:
Ihre JndiExporter müssen implementiert BeanFactoryAware zum abrufen der spring-bean mit dem eingespritzten BeanFactory.
Dies ist eine mögliche können 🙂
Danke für die Fragen. Ich schrieb eine Variante von Treydone Lösung und dachte, es könnte nützlich sein, um den tatsächlichen code hier (da es ziemlich kurz):
Beachten Sie, dass ich umgesetzt InitializingBean statt BeanFactoryAware. Dies ermöglicht eine Konfiguration (mit Referenzen) wie folgt:
Ich weiß, das ist eine alte Frage, aber es gibt einen Weg, dies zu tun, ohne benutzerdefinierten code. Es ist ziemlich ausführlich, aber 100% deklarativ.
Den
MethodInvokingFactoryBean
können auch verwendet werden, um Eigenschaften von System (die ist nützlich bei der Verwendung von Atomikos), solange die bean, liest die System-Eigenschaftendepends-on
dassMethodInvokingFactoryBean
.Hi
Es gibt keine standard-oder best-practices-Ansatz für dieses problem. Sie kommen mit Ihrem eigenen Ansatz. Im folgenden ist der andere Ansatz, die können sich um Ihr problem kümmert.
Machen javax.die Benennung.InitialContext eine spring bean (sagen initialContext). Stellen Sie sicher, Sie passieren Sie eine entsprechende Karte der ursprünglichen Eigenschaften wie erforderlich.
Erstellen Sie nun ein anderes bean sagen JndiBinder. Injizieren Sie die Bohne erwähnt #1 oben in diesem bean. Dieser Bohne wird eine Karte der jndi-Namen und der entsprechenden Objekte. Für Ihren Fall ist, wird das Objekt datasource, die bereits im Frühjahr Kontext.
In der JndiBinder bean-definition, schreiben Sie eine init-Methode, die Sie nennen würde-binden menthod von initialContext für alle Einträge in der map (der jndi-Namen und der zugehörigen Objekte). Auf diese Weise werden alle Einträge in der map geliefert werden, gebunden an den JNDI-Baum.
Wenn der code ausgeführt wird, der außerhalb einer Servlet-container, z.B. in einem unit-test, den JNDI-Kontext muss emuliert werden. Sonst hat man den gefürchteten "angeben Müssen Klassennamen in der Umgebung ..." - Fehler.
SimpleNamingContextBuilder ist besser geeignet dafür, als JndiTemplate:
Übersehen Sie nicht die "contextBuilder.aktivieren();" Zeile.