`
mj4d
  • 浏览: 302893 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

CXF:基于JAX-WS的webservice

阅读更多

本文主要涉及的webservice采用SOAP协议、采用JAX-WS作为前端、JAXB数据绑定。需要加入以下依赖:

<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-frontend-jaxws</artifactId>
	<version>2.7.0</version>
</dependency>

<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-bindings-soap</artifactId>
	<version>2.7.0</version>
</dependency>

<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-databinding-jaxb</artifactId>
	<version>2.7.0</version>
</dependency>

<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-transports-http</artifactId>
	<version>2.7.0</version>
</dependency>

1、server端

与之前基于JAX-WS的webservice一致,作为前端并不需要有任何修改。在这个例子中包含了传递String、自定义对象、Map等

@WebService(serviceName = "cxfServer")
public class CXFServiceImpl implements CXFService {

    @Override
    @WebMethod
    public String sayHello(String name) {
        return "Hello, " + name + ", from CXF";
    }

    @Override
    @WebMethod
    @WebResult
    @XmlJavaTypeAdapter(value = MapAdapter.class)
    public Map<String, Person> queryPerson() {
        Map<String, Person> map = new HashMap<String, Person>();
        map.put("p1", new Person("robin", "robin_123"));
        map.put("p2", new Person("ace", "ace_456"));
        return map;
    }

    @Override
    @WebMethod
    public void savePerson(@WebParam List<Person> list) {
        if (list != null && !list.isEmpty()) {
            for (Person person : list) {
                System.out.println(ToStringBuilder.reflectionToString(person, ToStringStyle.SHORT_PREFIX_STYLE));
            }
        }
    }

}

注意对传递Map,在JAX-WS是不能直接传递,需要作为一个包装类传递。而在CXF中则可以直接传递,这里还是采用JAXB作为解析对象故这里的MapAdapter与之前的一致.见这里

 

2、发布为一个webservice

1、jaxwsserver

JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(CXFServiceImpl.class);
factory.setAddress("http://localhost:8080/service/helloCxfService");
//optional: set in interceptors
factory.getInInterceptors().add(new LoggingInInterceptor());
//optional: set out interceptors
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.create();

由于采用jetty作为默认的Server的实现,需要加入

<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-transports-http-jetty</artifactId>
	<version>2.7.0</version>
</dependency>

 运行后即可通过http://localhost:8080/service/helloCxfService?wsdl查看发布结果。或者可以通过这样测试

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(CXFService.class);
factory.setAddress("http://localhost:8080/service/helloCxfService");
CXFService server = (CXFService) factory.create();
 

2、spring集成的几种方式

需要在spring的配置文件加入相应的schema及location:

xmlns:jaxws="http://cxf.apache.org/jaxws"
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" />

打开位于cxf-rt-frontend-jaxws-2.7.0.jar/schemas/jaxws.xsd文件,我们查看定义了三种方式:

 

jaxws:endpoint
jaxws:server
jaxws:client

前两者用来申明发布server,后者作为客户端的配置。下面来看看与spring继承的几种方式:

1、采用jaxws:server配置

<!-- 采用jaxws:server方式 -->
<jaxws:server id="helloCxf" serviceClass="org.ws.server.cxf.chap1.CXFService"
	address="http://localhost:8080/service/helloCxf">
	<jaxws:serviceBean>
		<bean class="org.ws.server.cxf.chap1.impl.CXFServiceImpl" />
	</jaxws:serviceBean>
	<jaxws:inInterceptors>
		<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
	</jaxws:inInterceptors>
	<jaxws:outInterceptors>
		<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
	</jaxws:outInterceptors>
</jaxws:server>
这里jaxws:endpoint的配置大同小异,具体参数配置见jaxws.xsd

 

2、由于采用JAX-WS作为前端,作为对JaxWsServerFactoryBean实例的注入:

<!-- 作为对JaxWsServerFactoryBean的注入 -->
<bean id="cxfServiceFactory" class="org.apache.cxf.jaxws.JaxWsServerFactoryBean">
	<property name="serviceClass" value="org.ws.server.cxf.chap1.impl.CXFServiceImpl" />
	<property name="address" value="http://localhost:8080/service/helloCxf" />
	<property name="inInterceptors">
		<list>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
		</list>
	</property>
	<property name="outInterceptors">
		<list>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
		</list>
	</property>
</bean>

<bean id="helloCxfService" class="org.ws.server.cxf.chap1.impl.CXFServiceImpl"

factory-bean="cxfServiceFactory" factory-method="create" />

  针对上面两种配置,可以通过在http://localhost:8080/service/helloCxf?wsdl访问发布成功与否。当然上面的address采用了绝对路径,实际上和web项目的整合只需要指定到相对路径即可。

3、与web项目(tomcat)
还是采用上面第二种配置,这里只需要修改address的路径如:
<property name="address" value="/helloCxf" />
在web.xml中需要添加一个servlet对请求的拦截处理,如:
<servlet>
	<servlet-name>CXFServlet</servlet-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>/service/*</url-pattern>
</servlet-mapping>
 运行后即可通过容器发布的路径访问,如:http://localhost:8080/webservice/service/helloCxf?wsdl

 

3、客户端访问

以上都是讲述的服务端的实现,如何发布一个服务。在上面的各种服务都是基于SOAP协议,用户可以获得生产的wsdl文件,来生产相应的客户端代码来完成远程的调用。在前面介绍JAX-WS的时候讲解了两种工具来生产客户端代码:wsimport/wsgen。而CXF也同样提供了类似的一些列工具,这里正对这种场景我们需要用到的是wsdl2java,位于CXF_HOME/bin目录
可以通过wsdl2java -help来看具体的参数,这里生产一个客户端代码如下:
wsdl2java -p org.sample.ws.client.cxf.chap1 -keep -verbose http://localhost:8080/webservice/service/helloCxf?wsdl
这样在指定的包下就生产了客户端代码。下面通过spring配置类测试客户端的调用,与上面发布服务一样,通过两种方式:
1、作为jaxws:client调用:
<jaxws:client id="helloCxfClient"
	address="http://localhost:8080/webservice/service/helloCxf"
	serviceClass="org.sample.ws.client.cxf.chap1.CXFService">
	<jaxws:inInterceptors>
		<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
	</jaxws:inInterceptors>
	<jaxws:outInterceptors>
		<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
	</jaxws:outInterceptors>
</jaxws:client>
 这里需要注意哪些配置是作为element哪些是attribute
2、作为对JaxWsProxyFactoryBean注入的实现:
<!-- 作为对JaxWsProxyFactoryBean的注入 -->
<bean id="cxfClientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
	<property name="serviceClass" value="org.sample.ws.client.cxf.chap1.CXFService" />
	<property name="address" value="http://localhost:8080/webservice/service/helloCxf" />
	<property name="inInterceptors">
		<list>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
		</list>
	</property>
	<property name="outInterceptors">
		<list>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
		</list>
	</property>
</bean>

<bean id="helloCxfService" class="org.sample.ws.client.cxf.chap1.CXFService"
	factory-bean="cxfClientFactory" factory-method="create" />
客户端测试代码:
ClassPathXmlApplicationContext xmlApplication = new ClassPathXmlApplicationContext("cxf-spring.xml");
CXFService service = (CXFService) xmlApplication.getBean("helloCxfService");
System.out.println(service.sayHello("robin"));

4、异步

由于采用JAX-WS作为前端,针对之前在用JAX-WS发布异步服务,我们这里也可以采用相同的方式:
编写binding.xml文件,指定异步方式:
<bindings   
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
	wsdlLocation="http://localhost:8080/webservice/service/helloCxf?wsdl"
	xmlns="http://java.sun.com/xml/ns/jaxws">
	<bindings node="wsdl:definitions">
		<enableAsyncMapping>true</enableAsyncMapping>
	</bindings>
</bindings>
在生成客户端的时候需要指定该binding.xml文件
wsdl2java -p org.sample.ws.client.cxf.chap2 -b .\binding.xml -keep -verbose http://localhost:8080/webservice/service/helloCxf?wsdl
测试:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(CXFService.class);
factory.setAddress("http://localhost:8080/webservice/service/helloCxf");
CXFService server = (CXFService) factory.create();

System.out.println("同步--> server.sayHello(\"robin\"):  " + server.sayHello("robin"));

Response<SayHelloResponse> response = server.sayHelloAsync("robin");
while (!response.isDone()) {
    System.out.println("异步调用......");
}
System.out.println("异步: " + response.get().getReturn());
 
分享到:
评论
1 楼 534255233 2014-03-31  

相关推荐

    Jax-ws所需要的JAR包

    Java API for XML Web Services(JAX-WS)是Java平台上用于构建和消费Web服务的标准API。它简化了创建和使用Web服务的过程,使得开发者能够通过SOAP消息与远程服务进行交互。JAX-WS允许开发者将服务接口直接映射到...

    JAX-WS2.0 API

    JAX-WS 2.0 API通常由Java EE服务器提供实现,例如Sun的Metro或Apache CXF。`jaxws-2_0-pfd-spec-api.jar`可能包含了JAX-WS 2.0规范的API类库,供开发者在应用中导入并使用。在实际开发中,还需要相应的实现库,如`...

    webservice之jax-ws

    开发者可以使用诸如Apache CXF、Metro等开源框架来支持JAX-WS的开发,这些框架提供了更多的功能,如WS-Security、WS-Policy等扩展,同时简化了开发过程。 8. **示例** 在提供的链接...

    基于JAX-WS标准采用CXF引擎设计开发WebService

    基于JAX-WS标准采用CXF引擎设计开发WebService

    MyEclipse6_5上基于JAX-WS开发Webservice(中文示例)

    在本教程中,我们将深入探讨如何在MyEclipse 6.5版本中使用JAX-WS(Java API for XML Web Services)技术开发Web服务。这是一个非常实用的指南,旨在帮助开发者快速掌握Webservice的创建、部署和测试过程,特别适合...

    JAX-WS 之 CXF 框架

    jax-ws方式的webservice服务,基于xml的webservice开发,资料很全面很珍贵,大师所写的书籍,真心不贵

    JAX-WS之旅(二)

    10. **工具支持**: 开发者可以使用诸如Apache CXF、Metro等JAX-WS实现工具,它们提供了丰富的功能,如代码生成、调试、测试等,大大简化了Web服务的开发过程。 在提供的源码中,我们可以看到实际的JAX-WS服务端和...

    java_webservice_JAX-RS.zip_cxf_jax_jax-rs_spring cxf

    文件"java webservice CXF JAX-WS(SOAP) + JAX-RS(RESTfull).docx"可能包含了具体的示例代码和详细步骤,帮助理解如何在SSH环境中集成并使用CXF和JAX-RS。建议参考文档中的内容进行实践操作,以加深理解。 总的来说...

    jax-ws基于web容器发布webServer

    2. **工具** - 可能提到了一些辅助工具,如Apache CXF或Metro,这些是常见的JAX-WS实现框架,用于简化开发工作。 **文件名解析:** 由于只有一个文件名"jax-ws基于web容器发布webServer",这可能是博客文章的HTML...

    JAX-WS_Java API for XML Web Services

    JAX-WS允许开发者使用Java编程语言来构建、部署和消费XML Web服务,它提供了基于WSDL(Web Services Description Language)的编程模型。 **一、JAX-WS的核心组件** 1. **SOAP绑定框架(SOAP Binding Framework)*...

    JAX-WS + Spring 实现webService示例

    **JAX-WS + Spring 实现Web Service示例** 在现代企业级应用开发中,Web Service作为一种跨平台、跨语言的通信方式,被广泛用于不同系统间的交互。本示例将详细阐述如何利用Java API for XML Web Services (JAX-WS)...

    axis-jax-ws-xfire.rar_jax

    描述中提到的“客户端调用分析”和“webservice万能客户端”,意味着这个压缩包可能包含了一份关于如何使用Axis、JAX-WS或XFire进行Web服务客户端开发的文档。通常,这会涵盖以下内容: - 如何使用这些工具生成...

    jax-ws-spring

    【CXF_Spring.part1.rar】和【CXF_Spring源码.rar】文件可能涉及Apache CXF,这是一个流行的开源框架,它扩展了JAX-WS,提供更高级的功能,如WS-*协议支持、基于注解的编程模型、以及与Spring的深度集成。学习CXF...

    JAX-WS技术

    JAX-WS(Java API for XML-Based Web Services)是一种用于开发基于SOAP的Java Web服务的基础技术。它为创建、部署和消费Web服务提供了丰富的工具和框架支持。JAX-WS的目标是简化Web服务的开发过程,并确保与现有的...

    jaxws-api-2.1-1

    在实际应用中,JAX-WS通常与Java EE服务器(如Tomcat、JBoss或WebLogic)一起使用,或者在Java SE环境中通过Apache CXF、Metro等实现库来提供和使用Web服务。开发者可以利用JAX-WS的强大功能,轻松地构建符合SOA...

    apache-cxf-3.1.1跟3.1.6所有jar包

    3. **JAX-WS和JAX-RS支持**:CXF完全支持JAX-WS(Java API for XML Web Services)和JAX-RS(Java API for RESTful Web Services),使开发者能轻松地创建和消费这两种类型的Web服务。 4. **数据绑定**:CXF支持...

    面向服务的架构(SOA)从入门到实战(融合WebService、JAX-WS、SCA开发MIS项目)

    本课程主要针对主流的SOA核心思想、融合WebService、JAX-WS、SCA、 Tuscany及开源产品技术CXF完成了从思想到技术,从技术到项目的课程体系.本课程主要是针对复杂的SOA 思想,通过项目开发的形式融会贯通给学员进行...

    EndPoint、JAX-WS方式的WebService,lzws.zip

    EndPoint、JAX-WS方式的WebService,请根据“创建WebService的几种方式简介(EndPoint、JAX-WS、CXF、axis2、自定义Servlet+Document解析)”文章配套练习

    JAX-WS 模仿天气预报发布

    JAX-WS提供的工具不仅限于`wsimport`,还有如Metro、Apache CXF等成熟的框架,它们提供了更高级的功能,如拦截器、数据绑定和安全支持。 9. **源码分析** 在博客文章中,作者可能详细讲解了如何创建和使用这些...

    Webservice-CXF实用手册学习大全

    WebService-CXF实用手册学习大全的知识点涵盖了WebService技术的多个方面,主要分为以下几个部分: 1. WebService基础: - WebService是一种通过网络提供服务的技术,使用HTTP作为传输协议,SOAP作为消息格式,...

Global site tag (gtag.js) - Google Analytics