JAXB convert List to Map

Viewed 55

I want collection(List) data convert to Map.

Using the list type, the results come out right. but, I use the map type, data can't correct binding.

Xml Data

<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 Code

@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
}

Adapter

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);
}

I write as above code. But running the program does not produce the desired results.

modules = null
testCases = null
tests = null

The data is not binding properly. Which part am I doing wrong and what should I do?

0 Answers
Related