wie man im Frühjahr deklarativ ein Objekt an jndi bindet (bindet)?

8

Wir haben eine einfache eigenständige Federanwendung und wir müssen jdbc datasource in jndi einfügen. (Wir verwenden jboss treecache und es muss Datenquelle im JNDI sein).

Etwas googeln fand die meisten jni-lookup-Beispiele mit spring, wo ein Objekt bereits in jndi steckt (per tomcat oder application server etc), aber wir brauchen etwas anderes: Ich habe eine einfache Datenquelle Spring Bean, in die ich injiziere andere Dienste, aber ich kann es nicht in TreeCache injizieren, weil es nur von jndi benötigt wird.

org.springframework.jndi.JndiTemplate gefunden, das als Bean deklariert werden kann, z. B .:

%Vor%

aber nicht gefunden, wie mit ihm anders als in Java-Code: fsJndiTemplate.bind(name, obj) von init-Methode einer anderen Bean zu binden. Gibt es eine Möglichkeit, es deklarativ zu tun?

    
yetanothercoder 12.05.2011, 07:35
quelle

5 Antworten

7

Sie können einen JndiExporter erstellen, der eine JndiTemplate verwendet, um eine Objektkarte mit einem Namen zu verknüpfen:

%Vor%

Ihr JndiExporter muss BeanFactoryAware implementieren, um die Spring Bean mit der injizierten BeanFactory abzurufen.

Dies ist eine mögliche may:)

    
Vincent Devillers 12.05.2011, 09:54
quelle
12

Danke für die Fragen. Ich schrieb eine Variante von Treydones Lösung und dachte, dass es nützlich sein könnte, hier den richtigen Code zu haben (da er ziemlich kurz ist):

%Vor%

Beachten Sie, dass ich InitializingBean anstelle von BeanFactoryAware implementiert habe. Dies ermöglicht eine Konfiguration (mit Referenzen) wie folgt:

%Vor%     
Spina 09.07.2012 16:31
quelle
5

Ich weiß, dass dies eine alte Frage ist, aber es gibt einen Weg, dies ohne benutzerdefinierten Code zu tun. Es ist ziemlich ausführlich, aber 100% deklarativ.

%Vor%

Das MethodInvokingFactoryBean kann auch verwendet werden, um Systemeigenschaften festzulegen ( was bei der Verwendung von Atomikos praktisch ist ) Solange die Bean die Systemeigenschaften depends-on that MethodInvokingFactoryBean .

liest %Vor%     
superEb 26.07.2013 21:41
quelle
2

Hallo    Für dieses Problem gibt es keinen Standardansatz oder Best Practices. Sie werden mit Ihrem eigenen Ansatz kommen. Folgendes ist der andere Ansatz, der sich um Ihr Problem kümmern kann.

  1. Machen Sie javax.naming.InitialContext eine Spring-Bean (sagen Sie initialContext). Stellen Sie sicher, dass Sie nach Bedarf eine geeignete Karte mit den Anfangseigenschaften übergeben.

  2. Erstellen Sie jetzt eine andere Bean sagen JndiBinder. Injizieren Sie die oben erwähnte Bohne in dieser Bohne. Diese Bean wird eine Karte von Jndi-Namen und entsprechenden Objekten aufnehmen. In Ihrem Fall ist das Objekt eine Datenquelle, die bereits im Frühling verfügbar ist.

  3. Schreiben Sie in der JndiBinder-Bean-Definition eine init-Methode, die für alle Einträge in der Map (von jndi-Namen und entsprechenden Objekten) bind menthold von initialContext aufruft. Auf diese Weise sind alle Einträge in der bereitgestellten Karte an die JNDI-Struktur gebunden.

Santosh 12.05.2011 10:32
quelle
0

Wenn der Code außerhalb eines Servlet-Containers ausgeführt wird, z. In einem Komponententest muss der JNDI-Kontext emuliert werden. Andernfalls erhalten Sie den gefürchteten Fehler "Sie müssen den Klassennamen in der Umgebung angeben ...".

SimpleNamingContextBuilder ist dafür besser geeignet als JndiTemplate:

%Vor%

Übersehen Sie nicht "contextBuilder.activate ();" Linie.

    
Agustí Sánchez 04.01.2015 00:04
quelle

Tags und Links