Soap Web 服务响应对象缺少@PayloadRoot 方法的 xmlns 属性
Soap webservice response object missing xmlns attributes for @PayloadRoot method
我正在开发一个用 Spring soap webservice
编写的 SOAP webservice 应用程序
应用程序只是 returns 它从客户端接收到的相同对象作为响应。
在CountryEndpoint.java
@PayloadRoot(namespace = "http://xml.dexter.com/Country", localPart = "CountryLocalPart")
public Country getCountry(SoapHeader soapHeader, @RequestPayload Country request, @SoapHeader(value = "MessageHeader") SoapHeaderElement messageHeader, MessageContext messageContext) {
System.out.println("THE REQUEST: "+request);
return request;
}
请求SOAPXML
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns2:Country xmlns="http://example.org" xmlns:ns2="http://xml.dexter.org/Country" xmlns:h="http://pqr.com/pqr.xsd xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<ns2:countryName>Spain</ns2:countryName>
<ns2:population>1213123</ns2:population>
</ns2:Country>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
响应SOAPXML
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns2:Country xmlns:ns2="http://xml.dexter.com/Country">
<ns2:countryName>Spain</ns2:countryName>
<ns2:population>1213123</ns2:population>
</ns2:Country>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
国家 XML 根元素似乎缺少 xmlns 属性。
客户端中的 JAXB 解组步骤失败。
错误是
ERROR: org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].
[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in
context with path [] threw exception [Request processing failed; nested
exception is org.springframework.oxm.UnmarshallingFailureException: JAXB
unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException:
unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/",
local:"Header"). Expected elements are <{http://www.....}Country>,<{http:
//www.....}Category>,<{http://www.....}SomeOther>] with root cause
javax.xml.bind.UnmarshalException: unexpected element
(uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Header"). Expected
elements are ...
我尝试添加@PayloadRoots 以及@Namespaces 和@Namespace 数组,但没有任何效果。
有没有办法让响应 SOAP xml 与请求 SOAP xml 相同?
谢谢!
请求中 Country
元素中带有前缀 h
、s
和默认值的命名空间 URI 是多余的,因为它们不对应于任何 XML 元素或属性。没有理由将它们发送到响应中,并且它们会影响 JAXB 解组结果的能力(假设所有内容都已正确映射)。
基于您的例外情况。您的 JAXB 客户端正在尝试解组 Header
元素,您需要解组 Country
元素。
我正在开发一个用 Spring soap webservice
编写的 SOAP webservice 应用程序应用程序只是 returns 它从客户端接收到的相同对象作为响应。
在CountryEndpoint.java
@PayloadRoot(namespace = "http://xml.dexter.com/Country", localPart = "CountryLocalPart")
public Country getCountry(SoapHeader soapHeader, @RequestPayload Country request, @SoapHeader(value = "MessageHeader") SoapHeaderElement messageHeader, MessageContext messageContext) {
System.out.println("THE REQUEST: "+request);
return request;
}
请求SOAPXML
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns2:Country xmlns="http://example.org" xmlns:ns2="http://xml.dexter.org/Country" xmlns:h="http://pqr.com/pqr.xsd xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<ns2:countryName>Spain</ns2:countryName>
<ns2:population>1213123</ns2:population>
</ns2:Country>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
响应SOAPXML
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns2:Country xmlns:ns2="http://xml.dexter.com/Country">
<ns2:countryName>Spain</ns2:countryName>
<ns2:population>1213123</ns2:population>
</ns2:Country>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
国家 XML 根元素似乎缺少 xmlns 属性。
客户端中的 JAXB 解组步骤失败。
错误是
ERROR: org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].
[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in
context with path [] threw exception [Request processing failed; nested
exception is org.springframework.oxm.UnmarshallingFailureException: JAXB
unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException:
unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/",
local:"Header"). Expected elements are <{http://www.....}Country>,<{http:
//www.....}Category>,<{http://www.....}SomeOther>] with root cause
javax.xml.bind.UnmarshalException: unexpected element
(uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Header"). Expected
elements are ...
我尝试添加@PayloadRoots 以及@Namespaces 和@Namespace 数组,但没有任何效果。
有没有办法让响应 SOAP xml 与请求 SOAP xml 相同?
谢谢!
请求中 Country
元素中带有前缀 h
、s
和默认值的命名空间 URI 是多余的,因为它们不对应于任何 XML 元素或属性。没有理由将它们发送到响应中,并且它们会影响 JAXB 解组结果的能力(假设所有内容都已正确映射)。
基于您的例外情况。您的 JAXB 客户端正在尝试解组 Header
元素,您需要解组 Country
元素。