NPE при использовании DI с Spring в проекте JAX-WS

#spring #dependency-injection #jax-ws #javabeans

#spring #внедрение зависимостей #jax-ws #javabeans

Вопрос:

Я работаю над проектом JAX-WS, и теперь я хотел бы добавить внедрение зависимостей для одной из моих утилит.

Утилита имеет интерфейс; GeocodeUtil и две реализации: GeocodeUtilGoogleImpl и geocodeutilyahoo impl. Теперь в моем классе обслуживания у меня есть следующее:

 public class MyService {
    private GeocodeUtil geocodeUtil;
    /* getter and setter for geocodeUtil */
}
  

В моем applicationContext.xml У меня есть следующее:

 <bean id="geocodeUtil" class="com.company.GeocodeUtilGoogleImpl"/>
<bean id="myService" class="com.company.MyService">
    <property name="geocodeUtil" ref="geocodeUtil" />
</bean>
  

Вот мой web.xml (только часть, относящаяся к Spring):

 <!-- Spring context -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<!-- Listeners -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  

Когда я создаю экземпляр объекта MyService и пытаюсь использовать geocodeUtil, я получаю исключение NullPointerException, и мне кажется, что реализация не была внедрена.
Что мне кажется странным, так это то, что как только я удаляю средство получения / настройки, приложение вылетает при запуске, а Spring жалуется на отсутствие средства установки / получения, что наводит меня на мысль, что XML-конфигурация на самом деле правильная.

Я не использую никаких Java-аннотаций, связанных с spring.

Любая помощь приветствуется.

Ответ №1:

Хотя из вашего сообщения это неясно, я подозреваю, что вы не извлекаете экземпляр из контекста приложения. Если вы не используете никаких аннотаций, то коду, который вызывает ваш объект MyService, необходимо извлечь компонент из контекста приложения, выполнив что-то вроде этого :

 ServletContext servletContext =this.getServletContext();

 WebApplicationContext wac = WebApplicationContextUtils.
getRequiredWebApplicationContext(servletContext);

 MyService user = (MyService)wac.getBean("myService");
  

Предоставленная вами конфигурация spring верна. Все, что вам нужно сделать, это убедиться, что контекст приложения создан, и что вы извлекаете свой объект из контекста приложения. Смотрите здесь для получения дополнительной информации:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-client

Комментарии:

1. Спасибо за информативный ответ. Из того, что я понял из вашего ответа, я могу избежать необходимости получать компонент через AppContext с аннотациями? Раньше я использовал Spring только с проектами Wicket, и в этих проектах я мог бы использовать аннотацию с именем «@SpringBean». Существует ли эквивалент этой аннотации для простого Spring?

2. Вы можете использовать @Autowired для подключения сервисов или @Resource. У обеих аннотаций есть свои плюсы и минусы. Взгляните на документы spring. Однако вам необходимо настроить веб-интерфейс для внедрения зависимостей, что означает, что вы должны добавить что-то вроде этого: <context:annotation-config/> в контекст вашего приложения (см.: static.springsource.org/spring/docs/3.0.x / … ) вероятно, вам придется выполнить какую-то другую конфигурацию, потому что вы не используете spring-mvc.

Ответ №2:

Вы также должны получить экземпляр службы из контекста Spring.

Создание объекта service с помощью оператора new не приведет к запуску spring для внедрения объектов для этого экземпляра.