`
puzhijun
  • 浏览: 13926 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

CXFMapAdapter

阅读更多
     刚做CXF的开发,发现CXF不支持Map类型,必须要自己写adapter,特地写下来,要建立两个类:


import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

/**
 * 为了让CXF支持Map而建立的适合配器
 * 
 * Title: CXFMap.java
 * 

 * 
 * Description:为了让CXF支持Map而建立的适合配器
 * 

 * 
 * Copyright: Copyright (c) 2010
 * 

 * 
 * @author: Sunny
 *          </p>
 * @date 2012-3-13上午09:38:31
 * @version 1.0
 * 
 */
@XmlType(name = "CXFMap")
@XmlAccessorType(XmlAccessType.FIELD)
public class CXFMap {
    @XmlElement(nillable = false, name = "entry")
    private List<CXFEntry> entries = new ArrayList<CXFEntry>();

    public List<CXFEntry> getEntries() {
        return entries;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "IdentifiedCXF")
    static class CXFEntry {
        // Map keys cannot be null
        @XmlElement(required = true, nillable = false)
        private String key;
        private String value;

        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
    }
}

    建立adapter类:
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * 为了让CXF支持Map而建立的适合配器
 * 
 * Title: CXFMapAdapter.java
 * 

 * 
 * Description:为了让CXF支持Map而建立的适合配器
 * 

 * 
 * Copyright: Copyright (c) 2010
 * 

 * 
 * 
 * @author: Sunny
 *          

 * @date 2012-3-13上午09:39:28
 * @version 1.0
 */
public class CXFMapAdapter extends XmlAdapter<CXFMap, Map<String, String>> {
	public CXFMap marshal(Map<String, String> v) throws Exception {
		CXFMap map = new CXFMap();
		for(Map.Entry<String, String> e : v.entrySet()) {
			CXFMap.CXFEntry iue = new CXFMap.CXFEntry();
			// 为了中文不出现乱码,所以在进行组装XML的时候进行编码
			iue.setValue(URLEncoder.encode(e.getValue(), "utf-8"));
			iue.setKey(e.getKey());
			map.getEntries().add(iue);
		}
		return map;
	}

	public Map<String, String> unmarshal(CXFMap v) throws Exception {
		Map<String, String> map = new LinkedHashMap<String, String>();
		for(CXFMap.CXFEntry e : v.getEntries()) {
			// 在客户端需要组装成Map对象的时候把原来的内容解码
			map.put(e.getKey(), URLDecoder.decode(e.getValue(), "utf-8"));
		}
		return map;
	}
}

     其中在传输中文的时候不知道怎么回事,始终有乱码,会造成客户端读取异常,所以采用url编码的方式传输.
     然后使用
@XmlJavaTypeAdapter(CXFMapAdapter.class) 
的方式标记在返回Map类型的webservice方法上,客户端跟服务器端都需要,并且包的路径跟名称也要相同。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics