I use @XmlJavaTypeAdapter
to transform Map<Key, Value>
objects into List<Value>
when marshalling and the other way round when un-marshalling
Then the XML I obtain :
<map>
<value>VALUE1</value>
...
</map>
My question is : how can I get rid of the surrounding tag in order to obtain
<value>VALUE1</value>
Bean Class
@XmlAccessorType(XmlAccessType.FIELD)
public class Data implements Serializable {
/**
* Constant for data value default name
*/
public static final String DATA_VALUE_DEFAULT_NAME = "result";
/**
* Serial version UID
*/
private static final long serialVersionUID = 7387937212735185585L;
/**
* key
*/
@XmlAttribute
private String key;
/**
* name
*/
@XmlAttribute
private String name;
/**
* Map of data
*/
@XmlJavaTypeAdapter(MapDataAdapter.class)
private Map<String, Data> dataMap;
/**
* Constructor
*/
public Data() {
}
}
Adapter
public class MapDataAdapter
extends XmlAdapter<MapDataAdapter.AdaptedDataMap,
Map<String, Data>> {
/**
* Adapted map
*/
public static class AdaptedDataMap {
/**
* List of entry
*/
@XmlElement(name = "data", required = true)
protected List<Data> entry = new ArrayList<>();
}
/**
* {@inheritDoc}
*/
@Override
public Map<String, Data> unmarshal(
AdaptedDataMap adaptedMap) throws Exception {
if (adaptedMap == null) {
return null;
}
Map<String, Data> map = new HashMap<>(adaptedMap.entry.size());
for (Data entry : adaptedMap.entry) {
map.put(entry.getKey(), entry);
}
return map;
}
/**
* {@inheritDoc}
*/
@Override
public AdaptedDataMap marshal(
Map<String, Data> map) throws Exception {
if (map == null) {
return null;
}
AdaptedDataMap adaptedMap = new AdaptedDataMap();
for (Entry<String, Data> mapEntry : map.entrySet()) {
adaptedMap.entry.add(mapEntry.getValue());
}
return adaptedMap;
}
}
XML Output
<data key="12" name="TEST1">
<dataMap>
<data key="text" name="TEST2">
<dataMap>
<data key="azerty" name="TEST3">
</data>
</dataMap>
</data>
</dataMap>
</data>
What I need
<data key="12" name="TEST1">
<data key="text" name="TEST2">
<data key="azerty" name="TEST3">
</data>
</data>
</data>