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?