Есть фрагмент XML-файла:
***
<resource>
<name>commands</name>
<method>POST</method>
<permissions mode="blacklist"></permissions>
<resource>
<name>login</name>
<permissions mode="blacklist"></permissions>
</resource>
<resource>
<name>logout</name>
<permissions>
<u>$all</u>
<u>BANNED</u>
</permissions>
</resource>
<resource>
<name>register</name>
<permissions>
<u>GUEST</u>
</permissions>
</resource>
<resource>
<name>addbook</name>
<permissions>
<u>$registered</u>
</permissions>
</resource>
<resource>
<name>changepassword</name>
<permissions>
<u>$registered</u>
</permissions>
</resource>
</resource>
***
Как видите, теги в нем могут быть вложены друг в друга. Вложенные идут только один за другим, так как в списке нет родительского тега.
На данный момент, используя JAXB, они конвертируются в List. Но мне нужно иметь HashMap вместо списка:
class Resource{
***
private HashMap<String, Resource> resources;
@XmlJavaTypeAdapter(ResourcesHashMapAdapter.class)
@XmlElement(name = "resource")
public HashMap<String, Resource> getResources() {
return resources;
}
public void setResources(HashMap<String, Resource> resources) {
this.resources = resources;
}
***
}
Я написал адаптер, который при демаршаллизации берет список и возвращает карту, но он не работает.
public class ResourcesHashMapAdapter extends XmlAdapter<LinkedList<Resource>, HashMap<String, Resource>> {
@Override
public HashMap<String, Resource> unmarshal(LinkedList<Resource> v) throws Exception {
HashMap<String, Resource> map = new HashMap<String, Resource>();
v.forEach(resource -> map.put(resource.getName(), resource));
System.out.println("IN ResourcesHashMapAdapter: " + v);
return map;
}
@Override
public LinkedList<Resource> marshal(HashMap<String, Resource> v) throws Exception {
return new LinkedList(v.values());
}
}
unmarshall () вызывается, но всегда получает пустой LinkedList. Что я должен изменить, чтобы правильно выполнить преобразование?
Проблема в том, что я не хочу привязывать тег ресурса к тегу ресурса