JAXB отменяется из списка в HashMap - PullRequest
0 голосов
/ 26 июня 2018

Есть фрагмент 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. Что я должен изменить, чтобы правильно выполнить преобразование?

Проблема в том, что я не хочу привязывать тег ресурса к тегу ресурса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...