微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

webservice Xfire 调用 返回值类型为map时,数据为空的问题

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++;
		Sy@R_404[email protected]("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++;
		Sy@R_404[email protected]("requestCount = " + requestCount);
		return list;
	}

	public Map<Integer,Address> getAddressMap() {
		requestCount++;
		Sy@R_404[email protected]("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++;
		Sy@R_404[email protected]("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();
		Sy@R_404[email protected]("list size: " + list.size());
		for (int i = 0; i < list.size(); i++) {
			Sy@R_404[email protected](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);
		
		Sy@R_404[email protected]("list size: " + result.size());
		for (int i = 0; i < result.size(); i++) {
			Sy@R_404[email protected](result.get(i));
		}
		
	}
	
	public static void getAddressMap() throws MalformedURLException {
		Service serviceModel = new ObjectServiceFactory().create(AddressManager.class,url);
		Map<Integer,Address> map = service.getAddressMap();
		Sy@R_404[email protected]("Map size: " + map.size());
		Sy@R_404[email protected](map);
	}
	
	public static void main(String[] args) throws MalformedURLException {
		getAddressList();
		
		Sy@R_404[email protected]("===================");
		
		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就在调用时就会为空。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐