webservice Xfire 调用 返回值类型为map时,数据为空的问题
发布时间:2020-12-16 23:09:39 所属栏目:安全 来源:网络整理
导读:package com.wxl.app.fz;import java.io.Serializable;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;public class Address implements Serializable {private static final lo
package com.wxl.app.fz; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class Address implements Serializable { private static final long serialVersionUID = -8352904000821895111L; private Integer id; private String address; private String city; private String province; private String country; private String postalCode; private String[] array; private List<Integer> list; private Map<Integer,InnerClass> map; private boolean isExist; private InnerClass innC; public static class InnerClass implements Serializable { private static final long serialVersionUID = -7263412221199319151L; private String innerName = "static InnerClass"; public InnerClass() { } public InnerClass(String innerName) { super(); this.innerName = innerName; } public String getInnerName() { return innerName; } public void setInnerName(String innerName) { this.innerName = innerName; } } public Address() { list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); map = new HashMap<Integer,InnerClass>(); map.put(1,new InnerClass("A")); map.put(2,new InnerClass("B")); map.put(3,new InnerClass("C")); innC = new InnerClass("服务端:Address.InnerClass"); } @Override public String toString() { return "Address [address=" + address + ",array=" + Arrays.toString(array) + ",city=" + city + ",country=" + country + ",id=" + id + ",innC=" + innC + ",isExist=" + isExist + ",list=" + list + ",map=" + map + ",postalCode=" + postalCode + ",province=" + province + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getPostalCode() { return postalCode; } public void setPostalCode(String postalCode) { this.postalCode = postalCode; } public String[] getArray() { return array; } public void setArray(String[] array) { this.array = array; } public List<Integer> getList() { return list; } public void setList(List<Integer> list) { this.list = list; } public Map<Integer,InnerClass> getMap() { return map; } public void setMap(Map<Integer,InnerClass> map) { this.map = map; } public boolean isExist() { return isExist; } public void setExist(boolean isExist) { this.isExist = isExist; } public InnerClass getInnC() { return innC; } public void setInnC(InnerClass innC) { this.innC = innC; } } package com.wxl.app.fz; import java.util.List; import java.util.Map; public interface AddressManager { public List<Address> getAddressList(); public List<Address> setAddressList(List<Address> list); public Map<Integer,Address> getAddressMap(); public Map<Integer,Address> setAddressMap(Map<Integer,Address> map); } package com.wxl.app.fz; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class AddressManagerImpl implements AddressManager { private int requestCount = 0; public List<Address> getAddressList() { requestCount++; System.out.println("requestCount = " + requestCount); List<Address> list = new ArrayList<Address>(); Address address = new Address(); address.setId(1); address.setAddress("HaiDian"); address.setArray(new String[] { "1","2","3" }); address.setCity("BeiJing"); address.setCountry("China"); address.setExist(false); address.setPostalCode("10081"); address.setProvince("BeiJing"); list.add(address); address = new Address(); address.setId(1); address.setAddress("ChaoYang"); address.setArray(new String[] { "A","B","C" }); address.setCity("BeiJing"); address.setCountry("China"); address.setExist(true); address.setPostalCode("10081"); address.setProvince("BeiJing"); list.add(address); return list; } public List<Address> setAddressList(List<Address> list) { requestCount++; System.out.println("requestCount = " + requestCount); return list; } public Map<Integer,Address> getAddressMap() { requestCount++; System.out.println("requestCount = " + requestCount); Map<Integer,Address> map = new HashMap<Integer,Address>(); Address address = new Address(); address.setId(1); address.setAddress("HaiDian"); address.setArray(new String[] { "1","3" }); address.setCity("BeiJing"); address.setCountry("China"); address.setExist(false); address.setPostalCode("10081"); address.setProvince("BeiJing"); map.put(address.getId(),address); address = new Address(); address.setId(1); address.setAddress("ChaoYang"); address.setArray(new String[] { "A","C" }); address.setCity("BeiJing"); address.setCountry("China"); address.setExist(true); address.setPostalCode("10081"); address.setProvince("BeiJing"); map.put(address.getId(),address); return map; } public Map<Integer,Address> map) { requestCount++; System.out.println("requestCount = " + requestCount); return map; } } AddressManager.aegis.xml <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd"> <mapping> <method name="getAddressList"> <return-type componentType="com.wxl.app.fz.Address" /> </method> <method name="setAddressList"> <parameter index="0" componentType="com.wxl.app.fz.Address" /> <return-type componentType="com.wxl.app.fz.Address" /> </method> <method name="getAddressMap"> <return-type componentType="com.wxl.app.fz.Address" /> </method> <method name="setAddressMap"> <parameter index="0" componentType="com.wxl.app.fz.Address" /> <return-type componentType="com.wxl.app.fz.Address" /> </method> </mapping> </mappings> package com.wxl.app.fz; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; public class AddressClient { private static String url = "http://localhost:8080/book/services/AddressService"; private static String namespace = "http://test/AddressService"; public static void getAddressList() throws MalformedURLException { Service serviceModel = new ObjectServiceFactory().create(AddressManager.class,null,namespace,null); XFireProxyFactory proxy = new XFireProxyFactory(); AddressManager service = (AddressManager) proxy.create(serviceModel,url); List<Address> list = service.getAddressList(); System.out.println("list size: " + list.size()); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } public static void setAddressList() throws MalformedURLException { Service serviceModel = new ObjectServiceFactory().create(AddressManager.class); XFireProxyFactory proxy = new XFireProxyFactory(); AddressManager service = (AddressManager) proxy.create(serviceModel,url); List<Address> list = new ArrayList<Address>(); Address address = new Address(); address.setId(1); address.setAddress("HaiDian"); address.setArray(new String[] { "1","C" }); address.setCity("BeiJing"); address.setCountry("China"); address.setExist(true); address.setPostalCode("10081"); address.setProvince("BeiJing"); list.add(address); List<Address> result = service.setAddressList(list); System.out.println("list size: " + result.size()); for (int i = 0; i < result.size(); i++) { System.out.println(result.get(i)); } } public static void getAddressMap() throws MalformedURLException { Service serviceModel = new ObjectServiceFactory().create(AddressManager.class,url); Map<Integer,Address> map = service.getAddressMap(); System.out.println("Map size: " + map.size()); System.out.println(map); } public static void main(String[] args) throws MalformedURLException { getAddressList(); System.out.println("==================="); setAddressList(); } } services.xml <service> <name>AddressService</name> <namespace>http://test/AddressService</namespace> <serviceClass>com.wxl.app.fz.AddressManager</serviceClass> <implementationClass>com.wxl.app.fz.AddressManagerImpl</implementationClass> </service> 关键的问题在于: 1、一定要使用ObjectServiceFactory的create(Class clazz,String name,String namespace,Map properties)方法,传递namespace参数。这个参数和services.xml中的namespace参数要一致。 2、一定要配置XXX.aegis.xml文件。虽然在参数和返回为集合时,在使用泛型的情况下,可以不用配置此文件,但是只要参数和返回值直接或间接的包括了Map,那么此map就在调用时就会为空。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |