网站建设知识
Apache CXF学习笔记二-复杂数据类型
2025-07-22 10:00  点击:0

环境:
[1]JDK 1.7.x
[2]Eclipse Mars.2 J2EE Version
[3]Spring 3.1.2.RELEASE
[4]CXF 3.0.9

概述:
用户自定义class引用自定义class是被CXF直接支持的,
重命名参数节点名称也做了示例这在学习笔记一里已经测试过了。

现在要测试
[1]修改自定义class成员的xml节点名(笔记一中只测试了指定root node的名)
[2]list容器。
等复杂参数的传递。


正文
服务端
pom.xml参考《Apach CXF学习笔记一》。
Step1:web.xml

    WSTest2               cription>Apache CXF Endpointcription>        cxf        cxf        org.apache.cxf.transport.servlet.CXFServlet        1                cxf        /ws//@XmlType也可以指定生成字段顺序,例如//@XmlType(propOrder = { "author", "name", "publisher", "isbn" })public class DataTypeContainNameMapping {//对象名称会被作为xml节点名称public int id;//把node的节点名称重定义为”mymessage“@XmlElement(name="mymessage")//因为上面的annotation只能调用一次,所以这次使用了“field”,而不是学习笔记一中的“attribute”。//因为"attribute"有get/set对,导致两次相同的(隐式)annotation。public String message;}

例二用的数据类型三个

package com.kagula.datatype;public class DataTypeP {public String p;}
package com.kagula.datatype;import java.util.List;public class DataTypeA extends DataTypeP{public String a;public List listB;}
package com.kagula.datatype;public class DataTypeB {public String b;public DataTypeB() {}public DataTypeB(String s) {b = s;}}



Step3:定义WS接口

package com.kagula;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import com.kagula.datatype.DataTypeA;import com.kagula.datatype.DataTypeMyPackage;@WebService  public interface IService {//@WebParam指定dtmp of DataTypeMyPackage的节点名称为package,如果不指定节点名为“arg0”。//@WebResult指定返回节点名称为package,如果不指定节点名为“return”。 @WebResult(name = "package") DataTypeMyPackage sayHi(@WebParam(name="package") DataTypeMyPackage dtmp);  //这次测带inherit和list特性的对象传递 DataTypeA sayHi2(DataTypeA aaa);}

Step4:实现WS接口

package com.kagula;import com.kagula.datatype.DataTypeA;import com.kagula.datatype.DataTypeB;import com.kagula.datatype.DataTypeMyPackage;public class ServiceImpl implements IService{@Overridepublic DataTypeMyPackage sayHi(DataTypeMyPackage dtmp){dtmp.dtcnm.id +=  1;dtmp.dtcnm.message = ("i got ["+dtmp.dtcnm.message+"] message.");return dtmp;}@Override public DataTypeA sayHi2(DataTypeA aaa) {aaa.p = "i got " + aaa.p;aaa.a = "i got " + aaa.a;for(int i=0;i

Step5::cxf-servlet.xml

和web.xml放在同一个目录中

                                    

客户端
是一个Java Application可以直接运行
源代码清单如下

package com.kagula;import java.util.ArrayList;import javax.xml.namespace.QName;import javax.xml.ws.Service;import javax.xml.ws.soap.SOAPBinding;import org.apache.cxf.frontend.ClientProxy;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import com.kagula.datatype.DataTypeA;import com.kagula.datatype.DataTypeB;import com.kagula.datatype.DataTypeMyPackage;public class Client {private static final QName SERVICE_NAME= new QName("kagula/", "IService");private static final QName PORT_NAME = new QName("kagula/", "IServicePort");public static void main(String[] args) throws Exception{Service service = Service.create(SERVICE_NAME);String endpointAddress = "localhost:8080/WSTest2/ws/hello";// Add a port to the Serviceservice.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);//    IService is = service.getPort(IService.class);//添加CXF自带的拦截器后,可以在Console中查看发送和返回的soap信息org.apache.cxf.endpoint.Client client = ClientProxy.getClient(is);client.getInInterceptors().add(new LoggingInInterceptor());client.getOutInterceptors().add(new LoggingOutInterceptor());    //测试重命名节点DataTypeMyPackage dtmp = new DataTypeMyPackage();dtmp.dtcnm.id = 1;dtmp.dtcnm.message=("chocolate and pie");        System.out.println(is.sayHi(dtmp).dtcnm.message);    System.out.println("==============================================");        //测试带继承和list的对象    DataTypeA aaa = new DataTypeA();    aaa.a = "aaa";    aaa.p = "ppp";    aaa.listB = new ArrayList<datatypeb>();    aaa.listB.add(new DataTypeB("bb0"));aaa.listB.add(new DataTypeB("bb1"));    DataTypeA dtaResult = is.sayHi2(aaa);     System.out.println(dtaResult.p+","+dtaResult.a);    for(int i=0;i<dtaresult.listb.size();i++) end="" function="" pre="">

备注[1]在“mvnrepository/artifact”下可以查询依赖库是否存在。[2]CXF3.0.9的示例代码可以通过下面的地址下载apache.org/dyn/closer.lua/cxf/3.0.9/apache-cxf-3.0.9.zip常见问题Q Cannot change version of project facet Dynamic Web Module to 2.5AStep1:修改项目.settings路径下的org.eclipse.wstmon.project.facet.core.xml文件jdk设成1.7,jst.web设成2.5,web.xml默认的2.3也要改成2.5。根据参考资料[3]我的tomcat是7应该设成3,但是这里只是做个CXF测试,所以随便设了个2.5版本。

Q 类成员没有映射到xml节点中A 还没有为类成员分配对象。