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

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

package cn.ibeans.ws.pojo;

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public 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;
}
@Override
public 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
*
*/
@WebService
public 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)
*/

@Override
public String toRegister(Person person) {
if(person!=null){
System.out.print("注册信息是:"+person);
}
return person.getName();
}

@Override
public 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
如果能得到如下图的效果,说明服务发布成功。
[img]http://dl.iteye.com/upload/attachment/0061/9154/e1d015ef-14e3-367d-aa12-9cac87aab705.png[/img]

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

打开dos窗口,找到cxf目前的bin目录(前提是你已经下载cxf项目并解压到本地)
执行命令:

wsdl2java http://localhost:9090/cxfServer/ws/register?wsdl

这一命令会在bin目录下生成一个包目录,包含多个java文件。
将这个包目录移到java工程中。我们可以查看生成了哪些文件:
[quote]
ObjectFactory.java
package-info.java
Person.java
RegisterWebService.java
ToRegister.java
ToRegisterResponse.java
[/quote]
另外还有一个实现类的包,有1个java文件:
[quote]
HelloWorldImplService.java
[/quote]我们只关注两个类就可以了:
一个是Person.java,这是web服务接口中的形参,我们要将数据封装到这个对象中,传递给服务端。
另外一个是RegisterWebService.java,它就是web服务类,我们要调用它的接口。

2、调用web服务接口
可以创建一个JUnit测试类,来测试一下:

/**
*
*/
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;
@Before
public void setUp() throws Exception {
factory = new JaxWsProxyFactoryBean();
person = new Person();
person.setName("zhangsan");
person.setSex("man");
}
@Test
public 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);
}

@Test
public 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" serviceClass="cn.ibeans.ws.RegisterWebService" address="http://localhost:9090/cxfServer/ws/register"/>

然后在测试类中先获取叫"client"的引用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值