请帮我找一下这个JAXB配置有什么问题。我正在解析这个XML。它会抛出异常。
豁免:
group : DummyMaster@ae7b77
group : master
group : null
Exception in thread "main" java.lang.NullPointerException
at TestDummy.main(TestDummy.java:21)
XML:
<?xml version="1.0" ?>
<master name="master">
<detail name="detail1">
</detail>
<detail name="detail2">
</detail>
</master>
测试:
JAXBContext jaxbContext = JAXBContext.newInstance(DummyMaster.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
DummyMaster group = (DummyMaster) jaxbUnmarshaller.unmarshal(new File("test1.xml"));
System.out.println("group : "+group);
System.out.println("group : "+group.getName());
System.out.println("group : "+group.getDetails());
System.out.println("group : "+group.getDetails().size());//Line 21
主人:
@XmlRootElement(name="master")
public class DummyMaster {
private String name;
private List<DummyDetail> details;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElementWrapper
@XmlElement
public List<DummyDetail> getDetails() {
return details;
}
public void setDetails(List<DummyDetail> details) {
this.details = details;
}
}
明细:
@XmlRootElement(name="detail")
public class DummyDetail {
private String name;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
答案 0 :(得分:2)
您在此行收到NullPointerException:
System.out.println("group : "+group.getDetails().size());
鉴于上面的行被执行,唯一可能的解释是getDetails()返回null,这意味着当你尝试调用size()时,你得到一个NPE。
选项1
这是因为您的XML不包含详细信息包装元素。
将您的XML更改为:
<?xml version="1.0" ?>
<master name="master">
<details>
<detail name="detail1">
</detail>
<detail name="detail2">
</detail>
</details>
</master>
选项2
在DummyMaster类中,完全删除@XmlElementWrapper注释,并使用@XmlElement(name =“detail”)注释getDetails方法。
然后按照原来的方式保留XML。
答案 1 :(得分:2)
更改您的DummyMaster类删除@XmlElementWrapper并添加@XmlElement(name =&#34; detail&#34;)
@XmlRootElement(name="master")
public class DummyMaster {
private String name;
private List<DummyDetail> details;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "detail")
public List<DummyDetail> getDetails() {
return details;
}
public void setDetails(List<DummyDetail> details) {
this.details = details;
}
}
答案 2 :(得分:1)
根据需要选择任何方式
仅更改DummyMaster#getDetails()
(不使用xml元素包装)
//1. comment out XmlElementWrapper
//2. name with XmlElement
//@XmlElementWrapper
@XmlElement(name="detail")
public List<DummyDetail> getDetails() {
return details;
}
更改DummyMaster#getDetails()
和 xml 文件撰写(使用xml元素包装器)
//method
@XmlElementWrapper(name="details")
@XmlElement(name="detail")
public List<DummyDetail> getDetails() {
return details;
}
//in xml <details> should wrap child <detail> tag
<details>
<detail name="detail1">
</detail>
<detail name="detail2">
</detail>
</details>