JAXB конвертировать список в карту - PullRequest
1 голос
/ 24 марта 2020

Я хочу, чтобы данные коллекции (List) преобразовывались в Map.

Используя тип списка, результаты получаются правильными. но я использую тип карты, данные не могут исправить привязку.

Xml Данные

<Result>
    <Module name="module1">
        <TestCase name="testCase1">
            <Test name="test1_1" result="pass"/>
            <Test name="test1_2" result="pass"/>
            <Test name="test1_3" result="fail"/>
            <Test name="test1_4" result="pass"/>
        </TestCase>
    </Module>
    <Module name="module2">
        <TestCase name="testCase2">
            <Test name="test2_1" result="pass"/>
            <Test name="test2_2" result="pass"/>
        </TestCase>
    </Module>
</Result>

Java Код

@XmlRootElement(name = "Result")
public class Result {
    @XmlJavaTypeAdapter(ModuleAdapter.class)
    @XmlElement(name = "Module")
    private Map<String, Module> modules;
}

public class Module {
    @XmlAttribute(name = "name")
    private String name;

    @XmlJavaTypeAdapter(TestCaseAdapter.class)
    @XmlElement(name = "TestCase")
    private Map<String, TestCase> testCases;

    // getter
}

public class TestCase {
    @XmlAttribute(name = "name")
    private String name;

    @XmlJavaTypeAdapter(TestAdapter.class)
    @XmlElement(name = "Test")
    private Map<String, Test> testList;

    // getter
}

public class Test {
    @XmlAttribute(name = "result")
    private String result;

    @XmlAttribute(name = "name")
    private String name;

    // getter
}

Адаптер

public class ModuleAdapter extends XmlAdapter<ArrayList<Module>, Map<String, Module>> {
    @Override
    public Map<String, Module> unmarshal(ArrayList<Module> v) throws Exception {
        return v.stream()
                .collect(toMap(Module::getName, m -> m));
    }

    @Override
    public ArrayList<Module> marshal(Map<String, Module> v) throws Exception {
        return new ArrayList<>(v.values());
    }
}

// TestCaseAdapter, TestAdapter is the same.

Main

public void parse() throws Exception {
    JAXBContext jaxbContext = JAXBContext.newInstance(Result.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

    File file = new File("test_result.xml");
    Result result = (Result) unmarshaller.unmarshal(file);
}

Я пишу как выше код. Но запуск программы не дает желаемых результатов.

modules = null
testCases = null
tests = null

Данные не связаны должным образом. Какую часть я делаю неправильно и что мне делать?

...