要把项目里的业务层,用 WebService 有选择的发布出来.
碰到调用 WebService 发布的服务时,业务层中 Spring 注入的 Bean 都为空的情况.(用JUnit调用服务是正常的)
好是一顿折腾,这个问题很普遍,不知道为什么网上好的解答并不多,所以把解决过程和大家分享.
问题分析, 业务层 Bean 使用的 Spring 容器和调用 WebService 服务中使用的不是同一个 Spring 容器.
所以,在 WebService 中获得不到已经注入的业务 Bean.
为了解决这个问题,先后用到 Axis1,Axis2 和 xfire.
最后经过徐培成(传智播客授业恩师)的指导,发现最新发布的 CXF(xfire改后的名), 解决这个问题很干脆.
1. apache-cxf-2.4.1 需要导入的包. 和其他框架集成的时候,注意去掉同名的包.
2. web.xml
<!-- WebService.CXF --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
注意:这里要是用到了 struts 等,要看一下过滤器或 servlet.
3. 在 Spring 的配置文件中配置. 这个是解决问题的关键.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <bean id="grupCustService" class="com.test.service.impl.GrupCustService"/> <jaxws:endpoint id="grupCustServiceweb" address="/GrupCustServiceWeb" implementorClass="com.test.service.impl.GrupCustService"> <jaxws:implementor ref="grupCustService"/> </jaxws:endpoint> </beans>
解决 Spring 注入 Bean 为空的情况,这个文件的配置是关键.
<jaxws:implementor ref="grupCustService"/>中, grupCustService 是需要发布的实现类,在 Spring 容器中注入的名.
只有加上这句, 就可以很顺利的获得业务 Bean.
@WebService (必须要有) public interface HelloWorld { String sayHello(@WebParam(name="text") String text); }
@WebService(endpointInterface = "com.test.service.HelloWorld", serviceName = "HelloWorld") public class HelloWorldImpl implements HelloWorld { public String sayHello(String text) { return "Hello " + text; } }