?前面几节都是讲一些理论知识,现在又用一个例子来说明一下,这一节我们就CXF框架对象传递进行讲解。?
??? 第一步:创建传输对象Customer?
- ???@XmlRootElement(name="Customer")??
- ???@XmlAccessorType(XmlAccessType.FIELD)??
- ???@XmlType(propOrder?=?{"name","age"})??
- ???public?class?Customer?{??
- ??
- private?int?age;??
- private?String?name;??
- ??
- public?int?getAge()?{??
- ????return?age;??
- }??
- ??
- public?void?setAge(int?age)?{??
- ????this.age?=?age;??
- }??
- ??
- public?String?getName()?{??
- ????return?name;??
- }??
- ??
- public?void?setName(String?name)?{??
- ????this.name?=?name;??
- }??
- ??
- ???}??
??? @XmlRootElement-指定XML根元素名称(可选)?
??? @XmlAccessorType-控制属性或方法序列化?
??? 四种方案:?
??? FIELD-对每个非静态,非瞬变属性JAXB工具自动绑定成XML,除非注明XmlTransient?
??? NONE-不做任何处理?
??? PROPERTY-对具有set/get方法的属性进行绑定,除非注明XmlTransient?
??? PUBLIC_MEMBER -对有set/get方法的属性或具有共公访问权限的属性进行绑定,除非注?
??? 明XmlTransient?
??? @XmlType-映射一个类或一个枚举类型成一个XML Schema类型?
?? 第二步:创建WebService接口
- ??@WebService??
- ??public?interface?HelloService?{??
- ??
- public?void?save(Customer?c1,Customer?c2);??
- ??
- public?void?test(String?args);??
- ??
- public?Customer?get(int?id);??
- ?}??
- ??
- ????
?? 每三步:创建WebService接口实现类
- ??@WebService??
- ??public?class?HelloServiceImpl?implements?HelloService?{??
- ??
- public?void?save(Customer?c1,?Customer?c2)?{??
- ??
- ????System.out.println(c1.getAge()+"---"+c2.getAge());??
- ????System.out.println(c1.getName()+"---"+c2.getName());??
- }??
- ??
- public?void?test(String?args)?{??
- ????System.out.println(args);??
- ??????
- }??
- ??
- public?Customer?get(int?id)?{??
- ????Customer?cus?=?new?Customer();??
- ????cus.setAge(100);??
- ????cus.setName("Josen");??
- ????return?cus;??
- }??
- ??
- ??
- ??
- ???}??
- ????
?? 第四步:创建服务端
- ?public?class?SoapServer?{??
- ??
- ublic?static?void?main(String[]?args){??
- //两种方法,任选一种发布WebService接口??
- ??????????????//Endpoint.publish("http://localhost:8080/helloService",?new???
- ???????????????HelloServiceImpl());??
- JaxWsServerFactoryBean?factory?=?new?JaxWsServerFactoryBean();??
- factory.setAddress("http://localhost:8080/helloService");??
- factory.setServiceClass(HelloServiceImpl.class);??
- ??????????????factory.getInInterceptors().add(new?LoggingInInterceptor());????????
- factory.getOutInterceptors().add(new?LoggingOutInterceptor());??
- factory.create();??
- ??
- ??}??
- ???
? 第五步:创建客户端
- ?public?class?SoapClient?{??
- ??
- public?static?void?main(String[]?args){??
- ????JaxWsProxyFactoryBean?factory?=?new?JaxWsProxyFactoryBean();??
- ????factory.setAddress("http://localhost:8080/helloService");??
- ????factory.setServiceClass(HelloService.class);??
- ???????????????factory.setServiceClass(HelloServiceImpl.class);??
- ???????????????factory.getInInterceptors().add(new?LoggingInInterceptor());??
- ????HelloService?service?=?(HelloService)factory.create();??
- ??????
- ????Customer?c1?=?new?Customer();??
- ????c1.setAge(1);??
- ????c1.setName("aaa");??
- ??????
- ????Customer?c2?=?new?Customer();??
- ????c2.setAge(2);??
- ????c2.setName("bbb");??
- ??????
- ????service.save(c1,?c2);??
- ????service.test("aaaaaaaaaaaaa");??
- }??
- ?}??
- ???
? 最后,测试程序?
? 运行服务端程序,在浏览器地址栏输入http://localhost:8080/helloService?wsdl查看接口是否发布成功。成功则运行一下客户端程序,看看对象传输是否成功。?
?? 现在我们来分析一下控制打印的日志信息。
信息: Inbound Message?
----------------------------?
ID: 1?
Address: /HelloWorld?
Encoding: UTF-8?
Content-Type: text/xml; charset=UTF-8?
Headers: {content-type=[text/xml; charset=UTF-8], connection=[keep-alive], Host=[localhost:9000], Content-Length=[184], SOAPAction=[""], User-Agent=[Apache CXF 2.2.2], Content-Type=[text/xml; charset=UTF-8], Accept=[*/*], Pragma=[no-cache], Cache-Control=[no-cache]}?
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:say xmlns:ns1="http://client.itdcl.com/"><text> Josen</text></ns1:say></soap:Body></soap:Envelope>
--------------------------------------?
2010-1-9 20:41:56 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose?
信息: Outbound Message?
---------------------------?
ID: 1?
Encoding: UTF-8?
Content-Type: text/xml?
Headers: {}?
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><text xmlns="http://client.itdcl.com/">hi Josen</text></soap:Header><soap:Body><ns1:sayResponse xmlns:ns1="http://client.itdcl.com/"></ns1:sayResponse></soap:Body></soap:Envelope>?
--------------------------------------?
2010-01-09 20:41:56.578::INFO:? seeing JVM BUG(s) - cancelling interestOps==0?
???? 当客户端向服器发送请求时,服务端LoggingInInterceptor拉截客户端发送过来的SOAP消息,如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">?
<soap:Body>?
<ns1:sayHi xmlns:ns1="http://client.itdcl.com/">?
<text>Josen</text>?
</ns1:sayHi>?
</soap:Body>?
</soap:Envelope>?
???? 客户端将请求信息封闭在<soap:Body></soap:Body>中,当然也可以将其放到<soap:Header></soap:Header>,只要在@WebParam中的header设置成true,默认为false;?
???? 服务器接到请求之后,响应客户端。同样以SOAP形式将信息封装好发回客户端,SOAP信息如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">?
<soap:Header>?
<text xmlns="http://client.itdcl.com/">hi Josen</text>?
</soap:Header>?
<soap:Body>?
<ns1:sayResponse xmlns:ns1="http://client.itdcl.com/"></ns1:sayResponse>?
</soap:Body>?
</soap:Envelope>?
?