当前位置: 代码迷 >> Web前端 >> WebService使用之CXF集成spring详解
  详细解决方案

WebService使用之CXF集成spring详解

热度:295   发布时间:2012-09-09 09:27:54.0
WebService应用之CXF集成spring详解
一. CXF与spring集成
1.简介:
CXF是基于JAX-WS实现的,JAX-WS规范是一组XML web services的JAVA API,它使用户无需编写复杂的SOAP ENV,WSDL。在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对于SOAP消息。
在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI (service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。
2.实现过程:
a) 为CXF设置编译和开发环境
在http://cxf.apache.org/download.html 下载相应的CXF包,/lib目录下的jar 文件引入工程
b) 新建工程,cxfspring,包含WebRoot/WEB-INF目录
c) 编写服务
首先写一个服务接口,例子中的HelloWorld.java。我们要注意的是这个例子使用了JSR181规范中的声明“@WebService”。
package demo.spring;
 
import javax.jws.WebService;
 
@WebService
public interface HelloWorld {
    String sayHi(String text);
}

下一步实现这个服务接口,例子中的HelloWorldImpl.java。这个例子代码中的“@WebService”标签只包含一个endpointInterface的属性,这个属性让CXF知道根据哪个接口生成WSDL文件。这里有点和我们第一个例子不同,没有包含ServiceName属性。这是因为这个属性会在Spring的配置文件中声明,请参考下面的beans.xml这个配置文件。
package demo.spring;
 
import javax.jws.WebService;
/**
 * javaDoc:http://download.oracle.com/javase/6/docs/api/overview-summary.html
 * 
 * @WebService
 * - <wsdl:service name="HelloWorldImplService">
 * - <wsdl:port binding="tns:HelloWorldImplServiceSoapBinding"  name="HelloWorldImplServicePort">
 * 	 - <soap:address location="http://localhost:8081/TestWebservice/HelloWorld" />
 * - </wsdl:port>
 * - </wsdl:service> 
 * targetNamespace: 命名空间,对应tns的定义;没写,默认是“http://”+包(package)反过来写。
 * 					加了这个属性,则参数的定义会用<wsdl:import location="http://localhost:8081/TestWebservice/HelloWorldService?wsdl=HelloWorldService.wsdl" ..>,
 * 					没加,参数定义就写在同一个wsdl文档
 * serviceName:对应wsdl文档,对应:<wsdl:service name="HelloWorldServieImplService">的name;不写,默认是"类名+Service";
 * portName:对应<wsdl:port binding="tns:HelloWorldServieImplServiceSoapBinding" name="HelloWorldServieImplPort">的name;不写,默认是"类名+ServicePort";
 * wsdlLocation: 对应映射的wsdl的物理地址
 * endpointInterface: 实现的接口
 * 
 * @Features:调用时,将请求和响应的SOAP信息打印出来
 */ 

@WebService(name="HelloWorldImpl",
//			targetNamespace="http://spring.demo",
			serviceName="HelloWorldImplService",
			portName="HelloWorldImplServicePort",
//			wsdlLocation = "file:/e:/healthEventRegistration.wsdl",
			endpointInterface="demo.spring.HelloWorld")
//@Features(features = "org.apache.cxf.feature.LoggingFeature")
public class HelloWorldImpl implements HelloWorld {
 
    public String sayHi(String text) {
        return "Hello " + text;
    }
}

d) 在spring中声明服务的Bean
CXF中包含对Spring2.0很好的支持。对于JAX-WS这一类配置,我们有<jaxws:endpoint>bean作为服务端节点的配置说明。
创建一个”beans.xml”文件在我们项目的WEB-INF路径下,注意这个文件的例子可以在“D:\cxf\samples\java_first_spring_support\”中找到。
<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" />
 
      <jaxws:endpoint 
        id="helloWorld" 
        implementor="demo.spring.HelloWorldImpl" 
        address="/HelloWorld" />
        
</beans>

<jaxws:endpoint>有三个属性id, implementor和address。
“id”指定这个Bean在Spring上下文中唯一的标识。
“implementor”指定了这个Web Service的实现类。
“address”指定了服务在Web服务器上发布的地址。这个地址可以包含ip和端口的完整地址,也可以是只包含相对路径的地址。

e) 配置web.xml
配置的过程中需要在web.xml中添加如下两项:
第一个是Spring的ContextLoaderListerp类会在启动时加载上面配置beans.xml文件。我们需要设定context-param节点;第二个是增加一个CXF Servlet。配置文件如下,
<web-app>
   <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>WEB-INF/beans.xml</param-value>
   </context-param>
   <listener>
          <listener-class>
          org.springframework.web.context.ContextLoaderListener
          </listener-class>
   </listener>
   <servlet>
          <servlet-name>CXFServlet</servlet-name>
          <display-name>CXF Servlet</display-name>
          <servlet-class>
          org.apache.cxf.transport.servlet.CXFServlet
          </servlet-class>
          <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
          <servlet-name>CXFServlet</servlet-name>
          <url-pattern>/*</url-pattern>
   </servlet-mapping>
</web-app>

这里需要注意的是配置的endpoint的地址(address)属性必须和在Beans.xml中定义的一致。尽管例子中没有在HelloWorldImpl.java中声明“address“属性,也需要在实际的配置中有所注意。
如果你在客户端代码要使用这个bean,代码会非常简单,例子如下
ApplicationContext context = ...; // your Spring ApplicationContext
HellWorld client = (HelloWorld) context.getBean("client");


如果朋友们觉得这篇文章对您有用,而且您需要茶叶茶具和零食之类的东东,请大家到下面这家店铺购买“品润茶业”,做批发的,价格超便宜,希望大家多多支持!
地址:http://prtea.taobao.com
请转载的朋友,把以上文字也带上,珍惜别人的劳动果实,谢谢!



  相关解决方案