使用 JAXB 在其主体中使用 CDATA 解组 SOAP 响应
Unmarshal SOAP response with CDATA in its body using JAXB
我正在尝试使用 JAXB 解组 SOAP 响应但没有成功。到目前为止,我所拥有的是使用 xsd 生成的模型 类 和以下应该解组响应的代码:
SOAPBody soapBody = soapResponse.getSOAPBody();
// Next line should get me to bspQuittung element from response
DOMSource domSource = new DOMSource(soapBody.getFirstChild().getFirstChild());
JAXBContext jaxbContext = JAXBContext.newInstance(BspQuittung.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
BspQuittung bspQuittung = jaxbUnmarshaller.unmarshal(domSource, BspQuittung.class).getValue();
然后我尝试访问 <AnnahmeErfolgreich>
元素的值,而不是像响应中的 true
那样,unmarshaller 给我的对象的值为 false
.
我错过了什么?再次调用 getFirstChild() 尝试更深入会导致 Unexpected node type: com.sun.xml.messaging.saaj.soap.impl.SOAPTextImpl
异常。
下面是回复本身:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:sendBspNachrichtNativeOutput xmlns:ns2="somevalue">
<bspQuittung><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BspQuittung version="1.5" fassung="2020-03-15" xmlns="somevalue">
<AnnahmeErfolgreich>true</AnnahmeErfolgreich>
<ErgebnisStatus>
<Tabelle>someInt</Tabelle>
<Schluessel>someInt</Schluessel>
</ErgebnisStatus>
</BspQuittung>]]></bspQuittung>
</ns2:sendBspNachrichtNativeOutput>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如何更改代码以使解组器按预期工作?谢谢!
我不得不使用 XMLStreamReader 作为回答 here 但我还使用了 InputStream
:
而不是文件
SOAPBody soapBody = soapResponse.getSOAPBody();
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
Node soapBodyChild = soapBody.getFirstChild();
String bspQuittungAsXmlString = soapBodyChild.getFirstChild().getFirstChild().getNodeValue();
byte[] bspQuittungAsByteArray = bspQuittungAsXmlString.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bspQuittungAsByteArray);
InputStreamReader inputStreamReader = new InputStreamReader(byteArrayInputStream);
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStreamReader);
JAXBContext jaxbContext = JAXBContext.newInstance(BspQuittung.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
BspQuittung bspQuittung = jaxbUnmarshaller.unmarshal(xmlStreamReader, BspQuittung.class).getValue();
xmlStreamReader.close();
inputStreamReader.close();
byteArrayInputStream.close();
在此之后,变量 bspQuittung
具有正确的值。
我正在尝试使用 JAXB 解组 SOAP 响应但没有成功。到目前为止,我所拥有的是使用 xsd 生成的模型 类 和以下应该解组响应的代码:
SOAPBody soapBody = soapResponse.getSOAPBody();
// Next line should get me to bspQuittung element from response
DOMSource domSource = new DOMSource(soapBody.getFirstChild().getFirstChild());
JAXBContext jaxbContext = JAXBContext.newInstance(BspQuittung.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
BspQuittung bspQuittung = jaxbUnmarshaller.unmarshal(domSource, BspQuittung.class).getValue();
然后我尝试访问 <AnnahmeErfolgreich>
元素的值,而不是像响应中的 true
那样,unmarshaller 给我的对象的值为 false
.
我错过了什么?再次调用 getFirstChild() 尝试更深入会导致 Unexpected node type: com.sun.xml.messaging.saaj.soap.impl.SOAPTextImpl
异常。
下面是回复本身:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:sendBspNachrichtNativeOutput xmlns:ns2="somevalue">
<bspQuittung><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BspQuittung version="1.5" fassung="2020-03-15" xmlns="somevalue">
<AnnahmeErfolgreich>true</AnnahmeErfolgreich>
<ErgebnisStatus>
<Tabelle>someInt</Tabelle>
<Schluessel>someInt</Schluessel>
</ErgebnisStatus>
</BspQuittung>]]></bspQuittung>
</ns2:sendBspNachrichtNativeOutput>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如何更改代码以使解组器按预期工作?谢谢!
我不得不使用 XMLStreamReader 作为回答 here 但我还使用了 InputStream
:
SOAPBody soapBody = soapResponse.getSOAPBody();
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
Node soapBodyChild = soapBody.getFirstChild();
String bspQuittungAsXmlString = soapBodyChild.getFirstChild().getFirstChild().getNodeValue();
byte[] bspQuittungAsByteArray = bspQuittungAsXmlString.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bspQuittungAsByteArray);
InputStreamReader inputStreamReader = new InputStreamReader(byteArrayInputStream);
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inputStreamReader);
JAXBContext jaxbContext = JAXBContext.newInstance(BspQuittung.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
BspQuittung bspQuittung = jaxbUnmarshaller.unmarshal(xmlStreamReader, BspQuittung.class).getValue();
xmlStreamReader.close();
inputStreamReader.close();
byteArrayInputStream.close();
在此之后,变量 bspQuittung
具有正确的值。