将复杂肥皂响应绑定到java bean

时间:2016-07-26 10:39:08

标签: java xml soap

我在xml中有一个soap响应:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<m:GetKgdErcInvoiceResponse xmlns:m="http://j2ee.netbeans.org/wsdl/SB_SERVICES/Invoice">
<response>
<result>RCVD</result>
<description>RCVD</description>
<Invoices xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:msgns="kz.eub.sb.wooppay.proxy.service" xmlns:ns0="http://j2ee.netbeans.org/wsdl/SB_SERVICES/Invoice" xmlns:ns2="kz.eub.sb.wooppay.proxy.service">
<Invoice Id="20160520112015039156">
<Header>
<Param Code="Address" Id="0">Кундакбаева Айман Жаксылыковна ул. Рыскулова, д. 5, кв. 50</Param>
<Param Code="formedDate" Id="1">2016-04-30 00:00:00</Param>
<Param Code="expireDate" Id="2">2016-06-01 00:00:00</Param>
</Header>
<Items>
<Item Id="1" Name="ТОО ҚарағандыЖылуСбыт электрическая энергия">
<Param Editable="true" Id="Amnt">1704.1</Param>
<Param Id="tariffType">FIXED</Param>
<Param Id="tariffMinValue">0</Param>
<Param Id="tariffMidValue">0</Param>
<Param Id="tariffMaxValue">0</Param>
<Param Id="tariffMinThreshold">0</Param>
<Param Id="tariffMaxThreshold">0</Param>
<Param Id="unit" />
<Param Id="counter" />
<Param Id="counterDate" />
<Param Id="lastCounter" />
<Param Id="lastCounterDate" />
<Param Id="debtInfo">задолженность 1704.10</Param>
</Item>
<Item Id="32" Name="ТОО ҚарағандыЖылуСбыт тепловая энергия и гвс">
<Param Editable="true" Id="Amnt">769.03</Param>
<Param Id="tariffType">FIXED</Param>
<Param Id="tariffMinValue">2</Param>
<Param Id="tariffMidValue">3</Param>
<Param Id="tariffMaxValue">4.8</Param>
<Param Id="tariffMinThreshold">6.4</Param>
<Param Id="tariffMaxThreshold">0</Param>
<Param Id="unit" />
<Param Id="counter" />
<Param Id="counterDate" />
<Param Id="lastCounter" />
<Param Id="lastCounterDate" />
<Param Id="debtInfo">задолженность 769.03</Param>
</Item>
<Item Id="65" Name="ТОО Қарағанды Су вода и канализация">
<Param Editable="true" Id="Amnt">0</Param>
<Param Id="tariffType">FIXED</Param>
<Param Id="tariffMinValue">0</Param>
<Param Id="tariffMidValue">0</Param>
<Param Id="tariffMaxValue">0</Param>
<Param Id="tariffMinThreshold">0</Param>
<Param Id="tariffMaxThreshold">0</Param>
<Param Id="unit" />
<Param Id="counter" />
<Param Id="counterDate" />
<Param Id="lastCounter" />
<Param Id="lastCounterDate" />
<Param Id="debtInfo">задолженность 0.00</Param>
</Item>
</Items>
<Summary>
<Amount Currency="KZT">2473.13</Amount>
</Summary>
</Invoice>
</Invoices>
</response>
</m:GetKgdErcInvoiceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

有没有什么好方法可以将它绑定到像bean这样的bean:

public class Invoice {
    String Id;
    String address;
    Date formedDate;
    Date expireDate;
    List<InvoiceItem> items;
    String currency;
    BigDecimal amount;
}

我尝试过不同的JAXB方式,但对我来说仍然没有运气。我想知道是否有一种比手动解析更好的方法。

编辑。

我设法获得了SOAP主体。但我无法将GetKgdErcInvoiceResponse绑定到Invoice类。是否可以使用JAXB注释?对我来说完美的解决方案就是:

SOAPMessage message = MessageFactory.newInstance().createMessage(null, new ByteArrayInputStream(soapStr.getBytes()));
Unmarshaller unmarshallerSoap = JAXBContext.newInstance(Invoice.class).createUnmarshaller();
Invoice invoice = (Invoice) unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument());

顺便说一下,我在尝试绑定SOAP body时遇到错误:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://j2ee.netbeans.org/wsdl/SB_SERVICES/Invoice", local:"GetKgdErcInvoiceResponse"). Expected elements are (none)

为什么期望元素不是?

1 个答案:

答案 0 :(得分:0)

有多种方法。 一种方法是使用SOAP库来分隔SOAP Header和SOAP body。 一旦你获得了身体的响应,那么你可以使用JAXB。我个人更喜欢apache普通消化器。

如果您想使用SOAP流,SAX解析器也可以使用。