前言:jdk提供了webService,但为什么使用jdk来开发webService相对少呢?
一个重要原因就是jdk支持的数据类型相对不足,例如Map就不为jdk所支持!
CXF支持的数据类型:
基本数据类型:
int、boolean、float等...
引用类型:
String、集合(Set、List、Map)、自定义数据类型...
补充说明:cxf支持所有的数据类型!
测试案例:
1.构建一个实体类Animals,为了测试基本数据类型,定义了三个属性,int型的id,String的name和float型的price
public class Animals { private int id; private String name;//动物名称 private float price;//动物价格 public Animals() { super(); } public Animals(int id, String name, float price) { super(); this.id = id; this.name = name; this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Animals [id=" + id + ", name=" + name + ", price=" + price + "]"; } }
2.编写SEI以及SEI实现类
@WebService public interface DataType { //添加一个动物 @WebMethod boolean addAnimal(Animals a); //查找一只动物 @WebMethod Animals findAnimalById(int id); //查找所有动物(测试List) @WebMethod List<Animals> findAllAnimals(); //查找所有动物(测试Map) @WebMethod Map<Integer,Animals> findAllForMap(); }
public class DataTypeImpl implements DataType { @Override public boolean addAnimal(Animals a) { //为方便测试,直接返回true return true; } @Override public Animals findAnimalById(int id) { return new Animals(1, "car", 50); } @Override public List<Animals> findAllAnimals() { List<Animals> list = new ArrayList<Animals>(); list.add(new Animals(1, "pig", 2000)); list.add(new Animals(2, "dog", 100)); list.add(new Animals(3, "duck", 40)); return list; } @Override public Map<Integer, Animals> findAllForMap() { Map<Integer, Animals> map = new HashMap<Integer, Animals>(); map.put(1, new Animals(1, "rabbit", 20)); map.put(2, new Animals(1, "chick", 30)); map.put(3, new Animals(1, "wolf", 20000)); return map; } }
3.发布
public class Publish { public static void main(String[] args) { String address = "http://localhost:8080/cxfServer"; Endpoint.publish(address, new DataTypeImpl()); System.out.println("如果发布成功,打印!"); } }
4.使用cxf生成客户端代码
生成后的结构为:
5.查看wsdl文档
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://datatype.cxf.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="DataTypeImplService" targetNamespace="http://datatype.cxf.com/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://datatype.cxf.com/" elementFormDefault="unqualified" targetNamespace="http://datatype.cxf.com/" version="1.0"> <xs:element name="addAnimal" type="tns:addAnimal"/> <xs:element name="addAnimalResponse" type="tns:addAnimalResponse"/> <xs:element name="findAllAnimals" type="tns:findAllAnimals"/> <xs:element name="findAllAnimalsResponse" type="tns:findAllAnimalsResponse"/> <xs:element name="findAllForMap" type="tns:findAllForMap"/> <xs:element name="findAllForMapResponse" type="tns:findAllForMapResponse"/> <xs:element name="findAnimalById" type="tns:findAnimalById"/> <xs:element name="findAnimalByIdResponse" type="tns:findAnimalByIdResponse"/> <xs:complexType name="findAllAnimals"> <xs:sequence/> </xs:complexType> <xs:complexType name="findAllAnimalsResponse"> <xs:sequence> <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:animals"/> </xs:sequence> </xs:complexType> <xs:complexType name="animals"> <xs:sequence> <xs:element name="id" type="xs:int"/> <xs:element minOccurs="0" name="name" type="xs:string"/> <xs:element name="price" type="xs:float"/> </xs:sequence> </xs:complexType> <xs:complexType name="findAllForMap"> <xs:sequence/> </xs:complexType> <xs:complexType name="findAllForMapResponse"> <xs:sequence> <xs:element name="_return"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" minOccurs="0" name="entry"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="key" type="xs:int"/> <xs:element minOccurs="0" name="value" type="tns:animals"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="addAnimal"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="tns:animals"/> </xs:sequence> </xs:complexType> <xs:complexType name="addAnimalResponse"> <xs:sequence> <xs:element name="return" type="xs:boolean"/> </xs:sequence> </xs:complexType> <xs:complexType name="findAnimalById"> <xs:sequence> <xs:element name="arg0" type="xs:int"/> </xs:sequence> </xs:complexType> <xs:complexType name="findAnimalByIdResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="tns:animals"/> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="findAnimalById"> <wsdl:part element="tns:findAnimalById" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="addAnimal"> <wsdl:part element="tns:addAnimal" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="findAllAnimalsResponse"> <wsdl:part element="tns:findAllAnimalsResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="findAllForMapResponse"> <wsdl:part element="tns:findAllForMapResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="findAnimalByIdResponse"> <wsdl:part element="tns:findAnimalByIdResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="addAnimalResponse"> <wsdl:part element="tns:addAnimalResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="findAllAnimals"> <wsdl:part element="tns:findAllAnimals" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="findAllForMap"> <wsdl:part element="tns:findAllForMap" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:portType name="DataType"> <wsdl:operation name="findAllAnimals"> <wsdl:input message="tns:findAllAnimals" name="findAllAnimals"> </wsdl:input> <wsdl:output message="tns:findAllAnimalsResponse" name="findAllAnimalsResponse"> </wsdl:output> </wsdl:operation> <wsdl:operation name="findAllForMap"> <wsdl:input message="tns:findAllForMap" name="findAllForMap"> </wsdl:input> <wsdl:output message="tns:findAllForMapResponse" name="findAllForMapResponse"> </wsdl:output> </wsdl:operation> <wsdl:operation name="addAnimal"> <wsdl:input message="tns:addAnimal" name="addAnimal"> </wsdl:input> <wsdl:output message="tns:addAnimalResponse" name="addAnimalResponse"> </wsdl:output> </wsdl:operation> <wsdl:operation name="findAnimalById"> <wsdl:input message="tns:findAnimalById" name="findAnimalById"> </wsdl:input> <wsdl:output message="tns:findAnimalByIdResponse" name="findAnimalByIdResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DataTypeImplServiceSoapBinding" type="tns:DataType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="findAllAnimals"> <soap:operation soapAction="" style="document"/> <wsdl:input name="findAllAnimals"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="findAllAnimalsResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="findAllForMap"> <soap:operation soapAction="" style="document"/> <wsdl:input name="findAllForMap"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="findAllForMapResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="addAnimal"> <soap:operation soapAction="" style="document"/> <wsdl:input name="addAnimal"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="addAnimalResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="findAnimalById"> <soap:operation soapAction="" style="document"/> <wsdl:input name="findAnimalById"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="findAnimalByIdResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="DataTypeImplService"> <wsdl:port binding="tns:DataTypeImplServiceSoapBinding" name="DataTypeImplPort"> <soap:address location="http://localhost:8080/cxfServer"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
6.测试(获取服务端各种数据类型的数据)
public class TestDataType { public static void main(String[] args) { DataTypeImplService factory = new DataTypeImplService(); DataType dataType = factory.getDataTypeImplPort(); boolean bool = dataType.addAnimal(new Animals()); System.out.println(bool); Animals a = dataType.findAnimalById(1); System.out.println(a); List<Animals> list = dataType.findAllAnimals(); System.out.println(list); Return r = dataType.findAllForMap(); List<FindAllForMapResponse.Return.Entry> entrys = r.getEntry(); for(Return.Entry entry : entrys){ int id = (int) entry.getKey(); Animals name = entry.getValue(); System.out.println(id+":"+name); } } }
运行结果:
true Animals [id=1, name=car, price=50.0] [Animals [id=1, name=pig, price=2000.0], Animals [id=2, name=dog, price=100.0], Animals [id=3, name=duck, price=40.0]] 1:Animals [id=1, name=rabbit, price=20.0] 2:Animals [id=1, name=chick, price=30.0] 3:Animals [id=1, name=wolf, price=20000.0]
注意:
map的使用方法略不同,使用dataType.findAllForMap();后,返回的是个Return类,下面是Return类代码:
public class FindAllForMapResponse { @XmlElement(required = true) protected FindAllForMapResponse.Return _return; public FindAllForMapResponse.Return getReturn() { return _return; } public void setReturn(FindAllForMapResponse.Return value) { this._return = value; } @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "entry" }) public static class Return { protected List<FindAllForMapResponse.Return.Entry> entry; public List<FindAllForMapResponse.Return.Entry> getEntry() { if (entry == null) { entry = new ArrayList<FindAllForMapResponse.Return.Entry>(); } return this.entry; } @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "key", "value" }) public static class Entry { protected Integer key; protected Animals value; public Integer getKey() { return key; } public void setKey(Integer value) { this.key = value; } public Animals getValue() { return value; } public void setValue(Animals value) { this.value = value; } } } }