2012-03-29 11 views
7

Mam problem z polem oznaczonym jako @Resource w fasoli Spring. Co mam:Spring @Resource Handling

polu, z metody setter, opatrzone @Resource

@Resource 
private URL someUrl; 

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

<env-entry> tag w moim deskryptorze (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> 

aplikacja nie uruchomi się z BeanCreationException, czego nie oczekuję, ponieważ niekoniecznie chcę, aby wiosna wstrzyknęła fasolę zarządzaną wiosennie. Chcę, aby Spring przetworzyła @Resource i odzyskała zasób JNDI.

To jest wiosna 2.5.6SEC03, a sama fasola jest opatrzona komentarzem @Service do automatycznego tworzenia w innych instancjach @Component. Kontener serwletu w tym przypadku to Tomcat 7, ale ostatecznie zostanie wdrożony na Weblogic 10, więc chociaż chciałbym, aby rozwiązanie działało na obu, Weblogic to must-have.

Czy niewłaściwie używam tej funkcji w Spring 2.5? Ogólnie? Czy jest trochę, czego mi brakuje? Coś źle rozumiem o JNDI? Cała pomoc jest doceniana. Dzięki.

Odpowiedz

7

Jeśli używasz adnotacji Spring Stereotype, (@Service, @Component ...), prawdopodobnie uwzględnisz w swojej konfiguracji wiosennej element <context:component-scan />, aby je odebrać. W porządku jest to zrobić, ale automatycznie zarejestruje on CommonAnnotationBeanPostProcessor w kontekście aplikacji, as stated just above the second note in this link.

Problem z włączeniem CommonAnnotationBeanPostProcessor polega na tym, że Spring obsługuje adnotację @Resource i spróbuje wstrzyknąć fasolę z kontekstu aplikacji. Możesz zarejestrować swój własny komponent CommonAnnotationBeanPostProcessor i powiedzieć Spring, aby umożliwić bezpośredni dostęp JNDI do tych @Resource przez skonfigurowanie komponentu bean, ustawiając właściwość alwaysUseJndiLookup na true.

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

Zwróć uwagę na notatki w powiązanej dokumentacji:

UWAGA: Domyślnym CommonAnnotationBeanPostProcessor zostanie zarejestrowana przez „Kontekst: adnotacji-config” i „Kontekst: Komponent-Scan” znaczników XML . Usuń lub wyłącz domyślną konfigurację adnotacji, jeśli chcesz określić niestandardową definicję komponentu bean CommonAnnotationBeanPostProcessor!

+0

Świetnie, to całkowicie działało! Odkryłem również, że można zmusić narzędzie CommonAnnotationBeanPostProcessor do wykonania wyszukiwania JNDI przez sprcifikowanie wartości dla "mappedName" w treści opisu. Wszystko, co powiedzieliśmy, i po pracy włożonej w to, dowiedziałem się, że nasz standardowy proces wdrożenia korporacyjnego nie obsługuje wielu deskryptorów wdrażania. Mam używać tego samego we wszystkich wdrożeniach. Takie podejście nie zadziała. –