[英]Parsing SOAP response to JAVA object
我正在尝试将 Soap 响应字符串解析为 JAVA object 以获取这些参数。
这是响应字符串:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns0:submitCdus1Response xmlns:ns0="http://example.com/">
<MessageId>D421425215</MessageId>
<NoOfDay>14</NoOfDay>
<Status>Y</Status>
<LastControlPoint>SBC</LastControlPoint>
<LastEntryDate>20210415</LastEntryDate>
<ReplyDateTime>20210427114126848</ReplyDateTime>
<TypeOfTravel>A</TypeOfTravel>
</ns0:submitCdus1Response>
</S:Body>
</S:Envelope>
我的 Object class:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="submitCdus1Response", namespace="http://example.com/" )
public class TravelHistoryResponseDTO implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@XmlAttribute(name = "MessageId")
private String MessageId;
@XmlAttribute(name = "NoOfDay")
private Integer NoOfDay;
@XmlAttribute(name = "Status")
private String Status; //Y , N ,
@XmlAttribute(name = "LastControlPoint")
private String LastControlPoint;
@XmlAttribute(name = "TypeOfTravel")
private String TypeOfTravel;// A
@XmlAttribute(name = "LastEntryDate")
private Date LastEntryDate;
@XmlAttribute(name = "ReplyDateTime")
private Date ReplyDateTime;
public String getMessageId() {
return MessageId;
}
public void setMessageId(String messageId) {
MessageId = messageId;
}
public Integer getNoOfDay() {
return NoOfDay;
}
public void setNoOfDay(Integer noOfDay) {
NoOfDay = noOfDay;
}
public String getStatus() {
return Status;
}
public void setStatus(String status) {
Status = status;
}
public String getLastControlPoint() {
return LastControlPoint;
}
public void setLastControlPoint(String lastControlPoint) {
LastControlPoint = lastControlPoint;
}
public String getTypeOfTravel() {
return TypeOfTravel;
}
public void setTypeOfTravel(String typeOfTravel) {
TypeOfTravel = typeOfTravel;
}
public Date getLastEntryDate() {
return LastEntryDate;
}
public void setLastEntryDate(Date lastEntryDate) {
LastEntryDate = lastEntryDate;
}
public Date getReplyDateTime() {
return ReplyDateTime;
}
public void setReplyDateTime(Date replyDateTime) {
ReplyDateTime = replyDateTime;
}
@Override
public String toString() {
return "TravelHistoryResponseDTO [MessageId=" + MessageId + ", NoOfDay=" + NoOfDay + ", Status=" + Status
+ ", LastControlPoint=" + LastControlPoint + ", TypeOfTravel=" + TypeOfTravel + ", LastEntryDate="
+ LastEntryDate + ", ReplyDateTime=" + ReplyDateTime + "]";
}
}
我的代码:
SOAPMessage message = MessageFactory.newInstance().createMessage(null,
new ByteArrayInputStream(responseString.getBytes()));
Unmarshaller unmarshaller = JAXBContext.newInstance(TravelHistoryResponseDTO.class).createUnmarshaller();
TravelHistoryResponseDTO dto = (TravelHistoryResponseDTO)unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument());
但我得到 javax.xml.bind.UnmarshalException: 意外元素(uri: http://example.com/" , local:"submitCdus1Response")。预期的元素是 <{}submitCdus1Response>
无论如何要解决这个问题并能够将 map 的参数传递给 java object?
There is an error in the JAXB object mapping: you are using @XmlAttribute
for the various fields of your object, but the XML data you are trying to read are not XML attributes ( <ns0:submitCdus1Response MessageId="xxx">
) but XML元素( <MessageId>xxx</MessageId>
)。
因此,您所要做的就是从@XmlAttribute
切换到@XmlElement
以匹配映射 object 到您的实际 XML。
注意:如果这真的来自 SOAP 调用,那么您很可能在某处有一个 XSD 架构,它定义了此处使用的 XML 结构。 JAXB 附带一个代码生成工具,该工具将为您创建 JAXB 对象(例如TravelHistoryResponseDTO
),从 XSD 派生数据。 该工具称为xjc
(您可以 google/搜索它),它带有 JDK,或者可以在 maven 插件中找到,(以及更多)。 这是该工具可以防止的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.