读书人

cxf学习札记之传递复杂对象

发布时间: 2012-09-05 15:19:34 作者: rapoo

cxf学习笔记之传递复杂对象
设计思路,创建一个人员注册的web服务。接受客户端传递的人员信息并注册到系统中。而这个人员信息是一个复杂对象。
一、服务端
1、创建人员类

package cn.ibeans.ws.pojo;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class Person {private String name;private String sex;/*public Person(String name, String sex) {super();this.name = name;this.sex = sex;}*/public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Person [name=" + name + ", sex=" + sex + "]";}}


2、定义服务接口
package cn.ibeans.ws;import javax.jws.WebService;import cn.ibeans.ws.pojo.Person;/** * 设计一个人员报名的web服务,人员信息是一个复杂对象。 * 服务端接收该对象后进行必要的处理,并将报名结果回传客户端 * @author llf * */@WebServicepublic interface RegisterWebService {public String toRegister(Person person);        public String toBatchRegister(List<Person> persons);}


3、定义服务接口的实现类
/** *  */package cn.ibeans.ws.impl;import javax.jws.WebMethod;import javax.jws.WebService;import cn.ibeans.ws.RegisterWebService;import cn.ibeans.ws.pojo.Person;/** * @author llf * */@WebService(endpointInterface="cn.ibeans.ws.RegisterWebService")public class RegisterWebServiceImpl implements RegisterWebService {/* (non-Javadoc) * @see cn.ibeans.ws.PersonWebService#toRegister(cn.ibeans.ws.pojo.Person) */@Overridepublic String toRegister(Person person) {if(person!=null){System.out.print("注册信息是:"+person);}return person.getName();}    @Overridepublic String toBatchRegister(List<Person> persons) {if(persons!=null){for(Person person:persons){System.out.println(person);}}return "ok";}}


4、发布web服务,这里借助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:p="http://www.springframework.org/schema/p"      xmlns:jaxws="http://cxf.apache.org/jaxws"      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.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="register"  implementor="cn.ibeans.ws.impl.RegisterWebServiceImpl" address="/ws/register"/>    </beans>


5、测试服务是否发布成功
(1)、部署web工程,并启动web容器
(2)、在地址栏中输入:http://localhost:9090/cxfServer/ws/register?wsdl
如果能得到如下图的效果,说明服务发布成功。


二、客户端
可以另建一个java工程来作为上面发布的web服务的客户端,通过调用该服务将人员信息注册到服务端。在java工程创建并加入cxf依赖包后,开始以下步骤:
1、创建服务接口在客户端的引用

打开dos窗口,找到cxf目前的bin目录(前提是你已经下载cxf项目并解压到本地)
执行命令:
wsdl2java http://localhost:9090/cxfServer/ws/register?wsdl

这一命令会在bin目录下生成一个包目录,包含多个java文件。
将这个包目录移到java工程中。我们可以查看生成了哪些文件:
/** * */package cn.ibeans.test.ws.client;import junit.framework.Assert;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import org.junit.Before;import org.junit.Test;import cn.ibeans.ws.Person;import cn.ibeans.ws.RegisterWebService;/** * @author llf * */public class RegisterWSTest {//RegisterWebService registerClient = (RegisterWebService)new RegisterWebServiceImplService();//registerClient.toRegister(null);private JaxWsProxyFactoryBean factory;private Person person;@Beforepublic void setUp() throws Exception {factory = new JaxWsProxyFactoryBean();person = new Person();person.setName("zhangsan");person.setSex("man");}@Testpublic void testRegister(){factory.setServiceClass(RegisterWebService.class);factory.setAddress("http://localhost:9090/cxfServer/ws/register");RegisterWebService client = (RegisterWebService)factory.create();String result = client.toRegister(person);Assert.assertEquals("zhangsan", result);} @Testpublic void testBatchRegister(){factory.setServiceClass(RegisterWebService.class);factory.setAddress("http://localhost:9090/cxfServer/ws/register");RegisterWebService client = (RegisterWebService)factory.create();//以上语句的功能 可以通过spring来实现Person p1 = new Person();p1.setName("zhangsan");p1.setSex("man");Person p2 = new Person();p2.setName("lishi");p2.setSex("man");Person p3 = new Person();p3.setName("wangwu");p3.setSex("woman");persons = new ArrayList<Person>();persons.add(p1);persons.add(p2);persons.add(p3);String result = client.toBatchRegister(persons);System.out.println("web service调用结果是:"+result);Assert.assertEquals("ok", result);}}
如果没个步骤都做对了,你会发现复杂对象Person已经被传递到服务端了。
3、注意:
(1)wsdl2java命令在客户端生成的类,除了与用来封装数据的复杂对象和服务接口类,其它都不是必须的,你也不一定非要用wsdl2java命令,如果对wsdl文档理解得很好完全可以自己写出这2个类
(2)客户端例子中没有用spring.如果用spring.则须在spring的配置文件中加上
<jaxws:endpoint id="client"  serviceaddress="http://localhost:9090/cxfServer/ws/register"/>

然后在测试类中先获取叫"client"的引用

读书人网 >Web前端

热点推荐