在JAX-WS项目中使用DI与Spring时的NPE

时间:2011-04-28 19:58:59

标签: spring dependency-injection jax-ws javabeans

我正在开发一个JAX-WS项目,现在我想为我的一个实用程序添加依赖注入。

该实用程序具有接口; GeocodeUtil和两个实现,GeocodeUtilGoogleImpl和GeocodeUtilYahooImpl。现在,在我的服务类中,我有以下内容:

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,在我看来,没有注入实现。 我认为很奇怪的是,一旦我删除了getter / setter,应用程序就会在启动时崩溃,Spring会抱怨缺少的setter / getter,这让我觉得XML配置实际上是正确的。

我没有使用任何与弹簧相关的Java注释。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

虽然您发布的内容尚不清楚,但我怀疑您没有从应用程序上下文中检索实例。如果您没有使用任何注释,那么调用MyService对象的代码需要通过执行以下操作从应用程序上下文中获取bean:

ServletContext servletContext =this.getServletContext();

 WebApplicationContext wac = WebApplicationContextUtils.
getRequiredWebApplicationContext(servletContext);

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

您提供的弹簧配置是正确的。您需要做的就是确保创建应用程序上下文,并从应用程序上下文中检索对象。有关详细信息,请参阅此处:

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

答案 1 :(得分:2)

您也应该从Spring上下文中获取Service实例。

使用new运算符创建服务对象不会触发spring为该实例注入对象。