底部的 TLDR:
根据JBossWS-cxf 用户指南,对于 Web 服务,web.xml 应包含以下内容
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>MyWebService</servlet-name>
<servlet-class>com.sgb.MyWebService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyWebService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Jboss 还期望在 WEB-INF 目录(而不是 cxf.xml)中有一个名为 jboss-cxf.xml 的描述符文件,它应该包含 jaxws:endpoint 标签,如下所示:
<beans xmlns='http://www.springframework.org/schema/beans'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:beans='http://www.springframework.org/schema/beans'
xmlns:jaxws='http://cxf.apache.org/jaxws'
xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://cxf.apache.org/jaxws >
<bean id="MyWebService" class="com.sgb.MyWebService" />
<jaxws:endpoint id="POJOEndpoint" implementor="#MyWebService" wsdlLocation="WEB-INF/wsdl/XYZ.wsdl" address="/warfilename">
<jaxws:invoker>
<bean class="org.jboss.wsf.stack.cxf.InvokerJSE" />
</jaxws:invoker>
</jaxws:endpoint>
</beans>
然后我创建了我的服务实现类:
package com.sgb;
@javax.jws.WebService(... ... ... )
public class MyWebService implements IMyWebService
{
public CreateResponse create(CreateRequest request)
{
... ... ... <-- an instance of createService is created
return createService.serve(request)
}
}
到目前为止,一切都很好。它工作正常。
但是,根据 Spring 的参考文档,为 Web 应用程序实例化应用程序上下文的便捷方法是像这样在 web.xml 中添加 ContextLoaderListener。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
所以,我可以在我的 web.xml 中添加上面的内容,然后用@Service注释MyWebService类,并确保为组件扫描设置了包。它也应该成为春季管理的bean。
问题是,它没有。JbossWS-CXF 似乎正在实例化 MyWebService,因此未注入依赖项,从而导致空指针。
我能够以编程方式获取 applicationContextClassPathXmlApplicationContext("/WEB-INF/applicationContext.xml")
然后使用注入/创建我的依赖项appContext.getBean()
但我希望直接使用注释来注入/自动装配依赖项。
TLDR:
我目前拥有的是这个。(这个bean是由jboss而不是spring创建的):
@javax.jws.WebService(... ... ... )
public class MyWebService implements IMyWebService
{
private ApplicationContext appContext;
public MyWebService(){
appContext = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext-ws.xml");
}
public CreateResponse create(CreateRequest request)
{
*** Use getBean() here to get my dependency. ***
IXyzService createService = appContext.getBean("createService",IXyzService.class);
return createService.serve(request)
}
}
我想要的是这样的:
@javax.jws.WebService(... ... ... )
@Service <-- <-- <-- ** This is Spring managed bean**
public class MyWebService implements IMyWebService
{
@Resource <-- <-- <-- **Dependency Injected by Spring**
IXyzService createService;
public CreateResponse create(CreateRequest request)
{
return createService.serve(request)
}
}
实现这一目标的最佳方法是什么???