2012-03-29 3 views
7

Ich habe Probleme mit einem Feld als @Resource in einer Spring Bean kommentiert. Was ich habe:Spring @Resource Handling

Ein Feld, mit Set-Methode,

@Resource 
private URL someUrl; 

public void setSomeUrl(URL someUrl) { 
    this.someUrl = someUrl; 
} 

Ein <env-entry> Tag in meinem Deployment Descriptor @Resource kommentierte (web.xml)

<env-entry> 
    <env-entry-name>someUrl</env-entry-name> 
    <env-entry-type>java.net.URL</env-entry-type> 
    <env-entry-value>http://somedomain.net/some/path</env-entry-value> 
</env-entry> 

Die Anwendung schlägt mit einem beginnen BeanCreationException, was ich nicht erwarte, weil ich nicht unbedingt möchte, dass eine Spring-Managed-Bean injiziert wird. Ich möchte, dass Spring @Resource verarbeitet und die JNDI-Ressource abruft.

Dies ist Spring 2.5.6SEC03 und die Bean selbst ist mit @Service zum Autowiren in andere @Component Instanzen annotiert. Der Servlet-Container ist in diesem Fall Tomcat 7, wird aber letztendlich auf Weblogic 10 bereitgestellt werden. Obwohl ich idealerweise eine Lösung für beide verwenden möchte, ist Weblogic das Must-Have.

Verwende ich diese Funktion in Frühling 2.5? Im Algemeinen? Gibt es ein bisschen was ich vermisse? Was habe ich an JNDI falsch verstanden? Alle Hilfe wird geschätzt. Vielen Dank.

Antwort

7

Wenn Sie Spring Stereotype Annotationen verwenden, (@Service, @Component ...), dann schließen Sie wahrscheinlich in Ihrer Frühlingskonfiguration das Element ein, um sie aufzunehmen. Es ist in Ordnung, dies zu tun, aber es wird automatisch eine CommonAnnotationBeanPostProcessor mit dem Anwendungskontext, as stated just above the second note in this link registrieren.

Das Problem mit der CommonAnnotationBeanPostProcessor ist, dass Spring die @Resource Annotation behandelt und versuchen wird, Beans aus seinem Anwendungskontext zu injizieren. Sie können Ihre eigene Bean CommonAnnotationBeanPostProcessor registrieren und Spring den direkten JNDI-Zugriff auf diese @Resource erlauben, indem Sie die Bean konfigurieren, indem Sie die alwaysUseJndiLookup-Eigenschaft auf true setzen.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> 
    <property name="alwaysUseJndiLookup" value="true"/> 
</bean> 

Achten Sie auf die Notiz in der verknüpften Dokumentation:

HINWEIS: Eine Standard-CommonAnnotationBeanPostProcessor wird durch die registriert werden "Kontext: Annotation-config" und "Kontext: component-scan" XML-Tags . Entfernen oder deaktivieren Sie die Standardanmerkungskonfiguration dort, wenn Sie eine benutzerdefinierte CommonAnnotationBeanPostProcessor-Beandefinition angeben möchten!

+0

Großartig, das hat total funktioniert! Ich habe auch festgestellt, dass Sie CommonAnnotationBeanPostProcessor zwingen können, eine JNDI-Suche durchzuführen, indem Sie einen Wert für "mappedName" im Annotation-Body angeben. Alles in allem haben wir nach der Arbeit gelernt, dass unser standardmäßiger Unternehmensbereitstellungsprozess nicht mehrere Implementierungsdeskriptoren unterstützt. Ich sollte das gleiche für alle Bereitstellungen verwenden. Also, dieser Ansatz wird nicht funktionieren. –