加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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就在调用时就会为空。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读