思路:
-- 客户端调用时的参数转换成服务端能处理的数据类型.
-- 服务端返回值转换成客户端能处理的数据类型.
转换器:
-- 在形参与返回值前面加注解:@XmlJavaTypeAdapter(转换类)
-- 自定义转换类需要继承XmlAdapter类.
XmlAdapter<ValueType,BoundType>
ValueType: JAXB知道怎么处理类型
BoundType: JAXB不知道怎么处理类型
注意:类型转换时数据不能丢失.
服务端接口
public @XmlJavaTypeAdapter(MapTransferAdapter.class) Map<String, String>
getMaps(@XmlJavaTypeAdapter(MapTransferAdapter.class) Map<String, String> params);
转换器:
public class MapTransferAdapter extends XmlAdapter<MapTransfer, Map<String, String>> {
/** 转进来: 把客户端调用参数,转换成服务器能处理的类型 */
@Override
public Map<String, String> unmarshal(MapTransfer v) throws Exception {
List<MapItem> lists = v.getMapItems();
Map<String, String> maps = new HashMap<>();
for (MapItem m : lists){
maps.put(m.getKey(), m.getValue());
}
return maps;
}
/** 转出去: 把服务端调用方法的返回值,转换成客户端能处理的数据类型 */
@Override
public MapTransfer marshal(Map<String, String> v) throws Exception {
MapTransfer mt = new MapTransfer();
for (Map.Entry<String, String> map : v.entrySet()){
// Entry: key-value
mt.getMapItems().add(new MapItem(map.getKey(), map.getValue()));
}
return mt;
}
}
复杂类型类
public class MapTransfer {
private List<MapItem> mapItems = new ArrayList<>();
public List<MapItem> getMapItems() {
return mapItems;
}
public void setMapItems(List<MapItem> mapItems) {
this.mapItems = mapItems;
}
}
public class MapItem {
private String key;
private String value;
public MapItem() {
}
public MapItem(String key, String value) {
super();
this.key = key;
this.value = 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;
}
}
当客户端调用服务是 方法执行顺序(这是我的顺序,仅供参考) 首先执行unmarshal--->调用的方法---->marshal--->返回客户端数据