• 4.CXF所支持的数据类型


    前言: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;
                }
    
            }
    
        }
    
    }
  • 相关阅读:
    Oracle数据库学习(四)
    近期整理
    2020/5/29
    2020/5/26
    2020/5/25
    2020/5/22
    2020/5/16
    2020/5/15
    2020/5/14
    2020/5/13
  • 原文地址:https://www.cnblogs.com/Json1208/p/5154921.html
Copyright © 2020-2023  润新知