ヘルパー クラス Pair
@XmlAccessorType(XmlAccessType.FIELD)
public class Pair {
@XmlAttribute
private String key;
@XmlValue
private String value;
public Pair() {
}
public Pair(String key, String value) {
this.key = key;
this.value = value;
}
//... getters, setters
}
ペア一覧
@XmlAccessorType(XmlAccessType.FIELD)
public class PairList
{
private List<Pair> values = new ArrayList<Pair>();
public PairList() {
}
//...
}
アダプタ
public class MapAdaptor extends XmlAdapter<PairList, Map<String, String>>
{
@Override
public Map<String, String> unmarshal(PairList list) throws Exception
{
Map<String, String> retVal = new HashMap<String, String>();
for (Pair keyValue : list.getValues())
{
retVal.put(keyValue.getKey(), keyValue.getValue());
}
return retVal;
}
@Override
public PairList marshal(Map<String, String> map) throws Exception
{
PairList retVal = new PairList();
for (String key : map.keySet())
{
retVal.getValues().add(new Pair(key, map.get(key)));
}
return retVal;
}
}
エンティティでの使用
@XmlJavaTypeAdapter(value = MapAdaptor.class)
private Map<String, String> imageUrls = new HashMap<String, String>();
PS
アダプター の代わりにクラスを使用
せずに実行できますPairList
Pair[]
PairList
public class MapAdaptor extends XmlAdapter<Pair[], Map<String, String>>
{
@Override
public Map<String, String> unmarshal(Pair[] list) throws Exception
{
Map<String, String> retVal = new HashMap<String, String>();
for (Pair keyValue : Arrays.asList(list))
{
retVal.put(keyValue.getKey(), keyValue.getValue());
}
return retVal;
}
@Override
public Pair[] marshal(Map<String, String> map) throws Exception
{
List<Pair> retVal = new ArrayList<Pair>();
for (String key : map.keySet())
{
retVal.add(new Pair(key, map.get(key)));
}
return retVal.toArray(new Pair[]{});
}
}
ただし、この場合、すべてのペアの名前を制御することはできません。アイテムとなり、変更することはできません
<item key="key2">valu2</item>
<item key="key1">valu1</item>
PS2の代わりに
使用しようとすると、List<Pair>
PairList
Exception
ERROR: java.util.List haven't no-arg constructor