【问题标题】:JAXB unmarshaller returns default values for fieldsJAXB unmarshaller 返回字段的默认值
【发布时间】:2021-10-27 03:21:31
【问题描述】:

我正在尝试编写一个 SOAP 客户端,它的任务之一是解组 SOAP 响应。但问题是,每当我尝试解组响应时,我只会得到空值。

这是一个示例肥皂响应

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <ns2:CreateOrderResponse xmlns:ns2="https://myns.com">
            <ns2:OrderID>100100</ns2:OrderID>
        </ns2:CreateOrderResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是soap消息的主体应该被解组到的POJO

package per.me.soapclient.response

import jakarta.xml.bind.annotation.*;
import lombok.Getter;

@XmlRootElement(name = "CreateOrderResponse", namespace = "https://myns.com")
@XmlType(propOrder = {"orderID"})
@XmlAccessorType(XmlAccessType.FIELD)
@Getter
public class GetOrderResponse {

    @XmlElement(name = "OrderID", namespace = "https://myns.com")
    public Long orderID;

}

这是解组逻辑

String soapXML = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
                                "    <SOAP-ENV:Header/>\n" +
                                "    <SOAP-ENV:Body>\n" +
                                "        <ns2:CreateOrderResponse xmlns:ns2=\"https://myns.com\">\n" +
                                "            <ns2:OrderID>100100</ns2:OrderID>\n" +
                                "        </ns2:CreateOrderResponse>\n" +
                                "    </SOAP-ENV:Body>\n" +
                                "</SOAP-ENV:Envelope>"

try {
      final MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
      final JAXBContext jaxbContext = JAXBContext.newInstance(CreateOrderResponse.class);
      final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
      try(ByteArrayInputStream bais = new ByteArrayInputStream(soapXML.getBytes(StandardCharsets.UTF_8))) {
        final SOAPMessage soapMessage = messageFactory.createMessage(new MimeHeaders(), bais);
        CreateOrderResponse response = unmarshaller.unmarshall(soapMessage.getSOAPBody(), CreateOrderResponse.class).getValue();

        Assertions.assertEquals(100100L, response.getOrderID());
      }
    } catch (SOAPException | JAXBException | IOException e) {
      throw new IllegalStateException(e);
    }

断言失败并显示以下消息

expected: <100100> but was: <null>
Expected :100100
Actual   :null

以防万一,这是我的package-info.java

@XmlSchema(namespace = "https://myns.com", elementFormDefault = XmlNsForm.QUALIFIED)
package per.me.soapclient.response;

import jakarta.xml.bind.annotation.XmlNsForm;
import jakarta.xml.bind.annotation.XmlSchema;

谁能告诉我我做错了什么?我被困住了,我真的什么都想不起来。

【问题讨论】:

    标签: soap jaxb java-11


    【解决方案1】:

    我太傻了。要传递给解组器的元素不是soap body,而是&lt;SOAP-ENV:Body&gt; 标签下的第一个子元素。

    所以我只需要做类似的事情

    CreateOrderResponse response = unmarshaller.unmarshal(soapMessage.getSOAPBody().getChildElements().next(), CreateOrderResponse.class).getValue();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2018-10-02
      • 2011-12-16
      • 2012-10-22
      相关资源
      最近更新 更多