2012-03-29 12 views
7

Ho problemi con un campo annotato come @Resource in un bean Spring. Quello che ho:Spring @Resource Handling

Un campo, con metodo setter, annotato @Resource

@Resource 
private URL someUrl; 

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

Un <env-entry> tag nel mio descrittore di deployment (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> 

L'applicazione non viene avviato con un BeanCreationException, che non mi aspetto perché non voglio necessariamente che molla inietti un bean gestito da Spring. Voglio che Spring elabori @Resource e recuperi la risorsa JNDI.

Questo è Spring 2.5.6SEC03 e il bean stesso è annotato @Service per l'autowiring in altre istanze @Component. In questo caso, il contenitore servlet è Tomcat 7, ma verrà in definitiva distribuito su Weblogic 10, quindi mentre preferisco che una soluzione funzioni su entrambi, Weblogic è il must-have.

Sto abusando di questa funzione in Spring 2.5? In generale? C'è un po 'che mi manca? Qualcosa che ho frainteso su JNDI? Tutto l'aiuto è apprezzato. Grazie.

risposta

7

Se si utilizzano le annotazioni Stereotipo primaverile, (@Service, @Component ...), probabilmente si include nella configurazione di primavera l'elemento <context:component-scan /> per prelevarle. Va bene, ma registrerà automaticamente un CommonAnnotationBeanPostProcessor con il contesto dell'applicazione, as stated just above the second note in this link.

Il problema con l'inclusione dello CommonAnnotationBeanPostProcessor è che Spring gestisce l'annotazione @Resource e tenterà di iniettare i fagioli dal contesto dell'applicazione. È possibile registrare il proprio bean CommonAnnotationBeanPostProcessor e comunicare a Spring di consentire l'accesso diretto JNDI a questi @Resource configurando il bean impostando la proprietà alwaysUseJndiLookup su true.

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

Prestare attenzione alla nota nella documentazione collegata:

NOTA: Un default CommonAnnotationBeanPostProcessor sarà registrato dal "contesto della nota:-config" e "contesto: component-scan" tag XML . Rimuovere o disattivare la configurazione di annotazione predefinita lì se si intende specificare una definizione di bean CommonAnnotationBeanPostProcessor personalizzata!

+0

Grande, questo ha funzionato perfettamente! Ho anche scoperto che è possibile forzare CommonAnnotationBeanPostProcessor per eseguire una ricerca JNDI estraendo un valore per "mappedName" nel corpo dell'annotazione. Detto questo, e dopo il lavoro svolto, ho appreso che il nostro processo di implementazione aziendale standard non supporterà più descrittori di implementazione. Dovrei usare lo stesso in tutte le distribuzioni. Quindi, questo approccio non funzionerà. –