@ Ресурс аннотированный член не введен - плохой код или ошибка? - PullRequest
3 голосов
/ 30 апреля 2010

Я использую аннотацию @Resource в классе, созданном в методе contextInitialized(...) ServletContextListener, но член всегда равен null. Вот мой пример кода.

Слушатель:

public void contextInitialized(ServletContextEvent sce) {
  System.err.println("In contextInitialised");
  new ResourceListenerTargetTest().executeMe(); 
}

ResourceListenerTargetTest:

@Resource(name="MyJDBCResource")
private DataSource source;
public void executeMe() {

  /*try {
    InitialContext ictx = new InitialContext();
    source = (DataSource)ictx.lookup("java:comp/env/MyJDBCResource");
  } catch (NamingException e) {
  e.printStackTrace();
  }*/

  System.err.println("source is " + source);
}

Если я переключаю комментарии и запускаю поиск ресурсов вручную, он работает нормально.

Должна ли аннотация @Resource работать так, когда она используется в методе contextInitalized?

Appserver - это WAS 7.0.0.5, если он должен работать, то, я думаю, это ошибка? Кто-нибудь может подтвердить?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Черт возьми. ошибка .

Код веб-контейнера инициализирует сервлет перед инъекцией извлечен из двигателя впрыска. В результате, если инициализация сервлета зависит от введенного ресурс, могут возникнуть проблемы.

Так как contextInitialized вызывается до того, как какие-либо сервлеты могут быть загружены, должна быть применена та же проблема.

1 голос
/ 30 апреля 2010

Еще одна вещь, которую следует учитывать, это то, что внедрение ресурсов будет работать только с объектами, созданными контейнером, поэтому даже если ресурсы уже были в вашем вызове contextInitialized, это не сработает, потому что ваш код создает Экземпляр ResourceListenerTargetTest, БЫЛ не знал бы, что вы собираетесь вводить ресурсы.

Или, по крайней мере, я надеюсь, что нет. В противном случае JVM WAS должна была бы перехватывать каждое создание отдельного объекта и следить за тем, чтобы конкретный объект не нуждался в инъекции, что может отрицательно сказаться на производительности.

Аналогичный / связанный принцип применяется в AOP, когда при вызове метода для объекта, который проксируется изнутри объекта, вызов метода не перехватывается (если это имеет смысл).

...