一些java类型不能自然映射成xml,例如,HashMap 或其他非 JavaBean 类,这个时候可以覆盖XmlAdapter来自定义转换方法。
XMlAdapter讲解:
javax.xml.bind.annotation.adapters
类 XmlAdapter<ValueType,BoundType>
类型参数:
BoundType - JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType 将此类型用作内存表示形式。
ValueType - JAXB 无需其他操作便知道如何处理的类型。
引入:
在CXF所些的服务端程序,被客户端程序调用时,SOAP中不支持Map(客户端传递Map参数或服务端返回Map数据),否则会如下错误:Marshalling Error: java.util.Map is not known to this context。
原因:
CXF中不支持Map
解决方案:
通过适配器将数组转换成HashMap的方式支持。
代码实现:
1、 定义Map转换器(code)import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
/**
* @author TEANA E-mail: [email protected]
* @version 创建时间:2011-7-1 下午11:21:49
* @DO Map转换器
*/
@XmlType(name = "MapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
public class MapConvertor
{
private List<MapEntry> entries = new ArrayList<MapEntry>();
public void addEntry(MapEntry entry)
{
entries.add(entry);
}
public static class MapEntry
{
public MapEntry()
{
super();
}
public MapEntry(Map.Entry<String, Object> entry)
{
super();
this.key = entry.getKey();
this.value = entry.getValue();
}
public MapEntry(String key, Object value)
{
super();
this.key = key;
this.value = value;
}
private String key;
private Object value;
public String getKey()
{
return key;
}
public void setKey(String key)
{
this.key = key;
}
public Object getValue()
{
return value;
}
public void setValue(Object value)
{
this.value = value;
}
}
public List<MapEntry> getEntries()
{
return entries;
}
}
2、 定义Map适配器(code)import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
/**
* @author TEANA E-mail: [email protected]
* @version 创建时间:2011-7-1 下午11:25:11
* @DO Map适配器
*/
public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>>
{
@Override
public MapConvertor marshal(Map<String, Object> map) throws Exception
{
MapConvertor convertor = new MapConvertor();
for (Map.Entry<String, Object> entry : map.entrySet())
{
MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry);
convertor.addEntry(e);
}
return convertor;
}
@Override
public Map<String, Object> unmarshal(MapConvertor map) throws Exception
{
Map<String, Object> result = new HashMap<String, Object>();
for (MapConvertor.MapEntry e : map.getEntries())
{
result.put(e.getKey(), e.getValue());
}
return result;
}
}
3、 在CXF服务端的接口程序中进行如下定义@WebMethod
@XmlJavaTypeAdapter(MapAdapter.class)
Map<String, String> getMap();
进行以上3个步骤,就可以实现CXF中对Map的支持。