Spring @Resource Handling - PullRequest
       9

Spring @Resource Handling

7 голосов
/ 29 марта 2012

У меня проблемы с полем, помеченным как @Resource в бобе Spring. Что у меня есть:

Поле с методом установки, аннотированное @Resource

@Resource
private URL someUrl;

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

Тег <env-entry> в моем дескрипторе развертывания (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>

Приложение не запускается с BeanCreationException, чего я не ожидаю, потому что я не хочу, чтобы spring добавляла bean-компонент, управляемый Spring. Я хочу, чтобы Spring обработал @Resource и получил ресурс JNDI.

Это Spring 2.5.6SEC03, а сам bean-компонент аннотирован @Service для автоматического подключения к другим @Component экземплярам. Контейнером сервлетов в данном случае является Tomcat 7, но в конечном итоге он будет развернут на Weblogic 10, поэтому, хотя в идеале я хотел бы, чтобы решение работало на обоих, Weblogic является обязательным.

Я неправильно использую эту функцию в Spring 2.5? В общем? Я что-то пропустил? Что-то я не так понимаю о JNDI? Вся помощь приветствуется. Благодаря.

1 Ответ

7 голосов
/ 29 марта 2012

Если вы используете аннотации Spring Stereotype (@Service, @Component ...), то, вероятно, вы включаете в свою конфигурацию пружины элемент <context:component-scan />, чтобы подобрать их. Это нормально, но он автоматически зарегистрирует CommonAnnotationBeanPostProcessor в контексте приложения, , как указано чуть выше второго примечания в этой ссылке .

Проблема с включением CommonAnnotationBeanPostProcessor заключается в том, что Spring обрабатывает аннотацию @Resource и пытается внедрить bean-компоненты из контекста своего приложения. Вы можете зарегистрировать свой собственный компонент CommonAnnotationBeanPostProcessor и сказать Spring, чтобы разрешить прямой доступ JNDI к этим @Resource, настроив компонент, установив для свойства alwaysUseJndiLookup значение true.

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

Обратите внимание на примечание в связанной документации:

ПРИМЕЧАНИЕ. По умолчанию теги CommonAnnotationBeanPostProcessor будут зарегистрированы тегами XML «context: annotation-config» и «context: component-scan». Удалите или отключите конфигурацию аннотации по умолчанию, если вы намерены указать пользовательское определение компонента CommonAnnotationBeanPostProcessor!

...