JAXB 解组器 returns 字段的默认值
JAXB unmarshaller returns default values for fields
我正在尝试编写 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 主体,而是 <SOAP-ENV:Body>
标记下的第一个子元素。
所以我只需要做类似
的事情
CreateOrderResponse response = unmarshaller.unmarshal(soapMessage.getSOAPBody().getChildElements().next(), CreateOrderResponse.class).getValue();
我正在尝试编写 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 主体,而是 <SOAP-ENV:Body>
标记下的第一个子元素。
所以我只需要做类似
的事情CreateOrderResponse response = unmarshaller.unmarshal(soapMessage.getSOAPBody().getChildElements().next(), CreateOrderResponse.class).getValue();