[英]JAXB Unmarshaller not processing lists in XML correctly
我正在使用JAXB Unmarshaller来将XML字符串转换为Java对象结构(使用Java 7;目前无法使用Java 8)。 我的对象列表有问题。 (对于其中包含的所有代码,我事先表示歉意。)这是输入的XML字符串:
<claimImportCompositeDTO>
<claimId>900</claimId>
<claimNumber>AT0000000000018</claimNumber>
<claimDTO>
<recordId>900</recordId>
<version>1</version>
<clmAddress>
<recordId>900</recordId>
<version>0</version>
</clmAddress>
<claimStatus>
<expired class="list">
<claimStatusDTO>
<recordId>900</recordId>
<version>1</version>
</claimStatusDTO>
<claimStatusDTO>
<recordId>910</recordId>
<version>2</version>
</claimStatusDTO>
</expired>
<statusCompleteWorkItemFlag>false</statusCompleteWorkItemFlag>
</claimStatus>
</claimDTO>
<notes class="list">
<notepadDTO>
<recordId>3503</recordId>
<version>0</version>
<notepadText class="list">
<notepadTextDTO>
<recordId>3503</recordId>
<version>0</version>
</notepadTextDTO>
<notepadTextDTO>
<recordId>3504</recordId>
<version>0</version>
</notepadTextDTO>
</notepadText>
</notepadDTO>
</notes>
</claimImportCompositeDTO>
这是各种对象的定义:
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class ClaimImportCompositeDTO {
private String _claimId;
private String _claimNumber;
private ClaimDTO _claimDTO;
private List<NotepadDTO> _notes;
public String getClaimId() {
return _claimId;
}
public String getClaimNumber() {
return _claimNumber;
}
public ClaimDTO getClaimDTO() {
return _claimDTO;
}
public List<NotepadDTO> getNotes() {
return _notes;
}
public void setClaimId(String claimId) {
this._claimId = claimId;
}
public void setClaimNumber(String claimNumber) {
this._claimNumber = claimNumber;
}
public void setClaimDTO(ClaimDTO claimDTO) {
this._claimDTO = claimDTO;
}
public void setNotes(List<NotepadDTO> notes) {
this._notes = notes;
}
}
public class ClaimDTO {
private String _recordId;
private String _version;
private ClmAddress _clmAddress;
private ClaimStatus _claimStatus;
public String getRecordId() {
return _recordId;
}
public String getVersion() {
return _version;
}
public ClmAddress getClmAddress() {
return _clmAddress;
}
public ClaimStatus getClaimStatus() {
return _claimStatus;
}
public void setRecordId(String recordId) {
this._recordId = recordId;
}
public void setVersion(String version) {
this._version = version;
}
public void setClmAddress(ClmAddress clmAddress) {
this._clmAddress = clmAddress;
}
public void setClaimStatus(ClaimStatus claimStatus) {
this._claimStatus = claimStatus;
}
}
public class ClmAddress {
private String _recordId;
private String _version;
public String getRecordId() {
return _recordId;
}
public String getVersion() {
return _version;
}
public void setRecordId(String recordId) {
this._recordId = recordId;
}
public void setVersion(String version) {
this._version = version;
}
}
import java.util.List;
public class ClaimStatus {
private List<ClaimStatusDTO> _expired;
private boolean _statusCompleteWorkItemFlag;
public List<ClaimStatusDTO> getExpired() {
return _expired;
}
public boolean isStatusCompleteWorkItemFlag() {
return _statusCompleteWorkItemFlag;
}
public void setExpired(List<ClaimStatusDTO> expired) {
this._expired = expired;
}
public void setStatusCompleteWorkItemFlag(boolean statusCompleteWorkItemFlag) {
this._statusCompleteWorkItemFlag = statusCompleteWorkItemFlag;
}
}
public class ClaimStatusDTO {
private String _recordId;
private String _version;
public String getRecordId() {
return _recordId;
}
public String getVersion() {
return _version;
}
public void setRecordId(String recordId) {
this._recordId = recordId;
}
public void setVersion(String version) {
this._version = version;
}
}
import java.util.List;
public class NotepadDTO {
private String _recordId;
private String _version;
private List<NotepadTextDTO> _notepadText;
public List<NotepadTextDTO> getNotepadText() {
return _notepadText;
}
public String getRecordId() {
return _recordId;
}
public String getVersion() {
return _version;
}
public void setNotepadText(List<NotepadTextDTO> notepadText) {
this._notepadText = notepadText;
}
public void setRecordId(String recordId) {
this._recordId = recordId;
}
public void setVersion(String version) {
this._version = version;
}
}
public class NotepadTextDTO {
private String _recordId;
private String _version;
public String getRecordId() {
return _recordId;
}
public String getVersion() {
return _version;
}
public void setRecordId(String recordId) {
this._recordId = recordId;
}
public void setVersion(String version) {
this._version = version;
}
}
这是输出:
<claimImportCompositeDTO>
<claimId>900</claimId>
<claimNumber>AT0000000000018</claimNumber>
<claimDTO>
<recordId>900</recordId>
<version>1</version>
<clmAddress>
<recordId>900</recordId>
<version>0</version>
</clmAddress>
<claimStatus>
<expired class="list">
<claimStatusDTO>
<recordId>null</recordId>
<version>null</version>
</claimStatusDTO>
</expired>
<statusCompleteWorkItemFlag>false</statusCompleteWorkItemFlag>
</claimStatus>
</claimDTO>
<notes class="list">
<notepadDTO>
<recordId>null</recordId>
<version>null</version>
<notepadText class="list"/>
</notepadDTO>
</notes>
</claimImportCompositeDTO>
当我运行解组器时,可以正确读取非列表数据,但是会跳过列表中的所有内容。 好吧,创建了一个对象(无论列表中有多少个对象),并且所有字段均为空(即ClaimsStatus->过期列表或注释列表)。
我希望我缺少一些基本的知识,但是我一直找不到这可能是什么。 有任何想法吗?
问题在于所提供的xml与您的POJO的结构不对应。 按照现有的设置和编码方式,对其进行修复的一种简单方法是在作为项目列表的字段上添加@XmlElementWrapper并更改其名称。 您需要将以下3类更改为下面的样子,然后才能正常工作:
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class ClaimImportCompositeDTO {
private String _claimId;
private String _claimNumber;
private ClaimDTO _claimDTO;
private List<NotepadDTO> _notepadDTO;
public String getClaimId() {
return _claimId;
}
public String getClaimNumber() {
return _claimNumber;
}
public ClaimDTO getClaimDTO() {
return _claimDTO;
}
@XmlElementWrapper(name = "notes")
public List<NotepadDTO> getNotepadDTO() {
return _notepadDTO;
}
public void setClaimId(String claimId) {
this._claimId = claimId;
}
public void setClaimNumber(String claimNumber) {
this._claimNumber = claimNumber;
}
public void setClaimDTO(ClaimDTO claimDTO) {
this._claimDTO = claimDTO;
}
public void setNotepadDTO(List<NotepadDTO> notes) {
this._notepadDTO = notes;
}
}
ClaimStatus类为:
@XmlAccessorType(XmlAccessType.PROPERTY)
public class ClaimStatus {
private List<ClaimStatusDTO> _claimStatusDTO;
private boolean _statusCompleteWorkItemFlag;
@XmlElementWrapper(name = "expired")
public List<ClaimStatusDTO> getClaimStatusDTO() {
return _claimStatusDTO;
}
public void setClaimStatusDTO(List<ClaimStatusDTO> claimStatusDto) {
this._claimStatusDTO = claimStatusDto;
}
public boolean isStatusCompleteWorkItemFlag() {
return _statusCompleteWorkItemFlag;
}
public void setStatusCompleteWorkItemFlag(boolean statusCompleteWorkItemFlag) {
this._statusCompleteWorkItemFlag = statusCompleteWorkItemFlag;
}
}
和记事本DTO:
@XmlAccessorType(XmlAccessType.PROPERTY)
public class NotepadDTO {
private String _recordId;
private String _version;
private List<NotepadTextDTO> _notepadTextDTO;
@XmlElementWrapper(name = "notepadText")
public List<NotepadTextDTO> getNotepadTextDTO() {
return _notepadTextDTO;
}
public String getRecordId() {
return _recordId;
}
public String getVersion() {
return _version;
}
public void setNotepadTextDTO(List<NotepadTextDTO> notepadText) {
this._notepadTextDTO = notepadText;
}
public void setRecordId(String recordId) {
this._recordId = recordId;
}
public void setVersion(String version) {
this._version = version;
}
}
您需要列表上的@XmlElement批注。 这样的事情。
@XmlElement(name = "notepadDTO")
private List<NotepadDTO> _notes;
这是我使用的教程: https : //howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.