Leo*_*ado 3 soap jaxb unmarshalling
我需要帮助将我的 Soap Envelope 映射到 java 类,我的目的是将结果操纵到数据库。
我在获取 SOAP Envelope 或使用 DB 方面没有任何问题,我的问题完全在于 JABX 以及根据我的 SOPA Envoloap 映射我的类。
这是我的肥皂:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<KD4SoapHeaderV2 xmlns="http://www.ibm.com/KD4Soap">A03ODA1YzhlZDQ2MWQAAQ==</KD4SoapHeaderV2>
</soap:Header>
<soap:Body>
<Response xmlns="http://tempuri.org/">
<Result xmlns:a="http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Errors />
<a:Count>329</a:Count>
<a:Return>SUCCESS</a:Return>
<a:DashboardDTOs>
<a:DashboardDTOs>
<a:Value>28.58</a:Value>
<a:Code>O001</a:Code>
<a:Name>Test2</a:Name>
</a:DashboardDTOs>
<a:DashboardDTOs>
<a:Value>40.22</a:Value>
<a:Code>O002</a:Code>
<a:Name>Test2</a:Name>
</a:DashboardDTOs>
<a:DashboardDTOs>
<a:Value>54.11</a:Value>
<a:Code>O003</a:Code>
<a:Name>Test3</a:Name>
</a:DashboardDTOs>
</a:DashboardDTOs>
</Result>
</Response>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
这是我接收主要值的类(计数、返回和仪表板 DTO 列表):
@XmlRootElement(name = "Response")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Response", propOrder = { "Count", "Return", "DashboardDTOs"})
public class Result {
@XmlElement(name="Count", required = true)
private Integer Count;
@XmlElement(name="Return", required = true)
private String Return;
@XmlElement(name = "DashboardDTOs")
private List<DashboardDTOs> DashboardDTOs;
...
Run Code Online (Sandbox Code Playgroud)
这是接收 DashboardDTO 的第二个模型:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DashboardDTOs", propOrder = {
"Value",
"Code",
"Name"
})
public class DashboardDTOs {
@XmlElement(name = "Value")
private double Value;
@XmlElement(name = "Code")
private String Code;
@XmlElement(name = "Name")
private String Name;
...
Run Code Online (Sandbox Code Playgroud)
我的应用程序尝试将 SOAPEnvelope 转换为结果,但出现错误:
Unmarshaller unmarshaller = JAXBContext.newInstance(Result.class).createUnmarshaller();
GetListSummarizedTransactionResultDTO returnValue = (Result)unmarshaller.unmarshal(soapMessagem.getSOAPBody().extractContentAsDocument());
unexpected element (uri:"http://tempuri.org/", local:"Response"). Expected elements are <{}Result>
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
谢
尝试这个:
首先你有你的根类 Response
@XmlRootElement(name = "Response", namespace = "http://tempuri.org/")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
@XmlElement(name="Result", namespace = "http://tempuri.org/")
private Result result;
}
Run Code Online (Sandbox Code Playgroud)
其中包含结果:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Result", propOrder = { "Errors", "Count", "Return", "DashboardDTOs"})
public class Result {
@XmlElement(name="Errors", required = true, namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private String Errors;
@XmlElement(name="Count", required = true, namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private Integer Count;
@XmlElement(name="Return", required = true, namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private String Return;
@XmlElement(name = "DashboardDTOs", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private List<DashboardDTOs> DashboardDTOs;
}
Run Code Online (Sandbox Code Playgroud)
现在,根据我的口味,它有点“混乱”。您的 xml 包含一个元素 DashboardDTOs,其中包含 DashboardDTO 列表,这些列表具有值、代码和名称。因此,您需要创建一个 DashboardDTOs 类,如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DashboardDTOs", propOrder = {
"Value",
"Code",
"Name",
"DashboardDTOs"
})
public class DashboardDTOs {
@XmlElement(name = "Value", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private double Value;
@XmlElement(name = "Code", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private String Code;
@XmlElement(name = "Name", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private String Name;
@XmlElement(name = "DashboardDTOs", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private List<DashboardDTOs> DashboardDTOs;
}
Run Code Online (Sandbox Code Playgroud)
这些 POJO 将允许您使用主体内指定的 xml 进行编组/解组。
更新以回复评论:
使用更新后的 xml,类将如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DashboardDTOs")
public class DashboardDTOs {
@XmlElement(name = "DashboardDTO", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private List<DashboardDTO> dashboardDTO;
}
Run Code Online (Sandbox Code Playgroud)
和:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {
"value",
"code",
"Nnme",
})
public class DashboardDTO {
@XmlElement(name = "Value", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private double value;
@XmlElement(name = "Code", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private String code;
@XmlElement(name = "Name", namespace = "http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response")
private String Nnme;
}
Run Code Online (Sandbox Code Playgroud)
现在使用 xml 文件(为了方便):
<Response xmlns="http://tempuri.org/">
<Result xmlns:a="http://schemas.datacontract.org/2004/07/PS.SharedWebServices.Response" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Errors />
<a:Count>329</a:Count>
<a:Return>SUCCESS</a:Return>
<a:DashboardDTOs>
<a:DashboardDTO>
<a:Value>28.58</a:Value>
<a:Code>O001</a:Code>
<a:Name>Test2</a:Name>
</a:DashboardDTO>
<a:DashboardDTO>
<a:Value>40.22</a:Value>
<a:Code>O002</a:Code>
<a:Name>Test2</a:Name>
</a:DashboardDTO>
<a:DashboardDTO>
<a:Value>54.11</a:Value>
<a:Code>O003</a:Code>
<a:Name>Test3</a:Name>
</a:DashboardDTO>
</a:DashboardDTOs>
</Result>
</Response>
Run Code Online (Sandbox Code Playgroud)
并尝试编组/解组是否在简单的 main 中工作:
public static void main(String[] args) {
try {
File file = new File("response.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Response response = (Response) jaxbUnmarshaller.unmarshal(file);
System.out.println(response);
} catch (JAXBException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说效果很好。在主要部分尝试一下,如果它有效,但在您的应用程序中不起作用,请告诉我,我们可以看看那里还有什么问题。
| 归档时间: |
|
| 查看次数: |
16218 次 |
| 最近记录: |