什么库决定了SOAP消息的序列化方式?

时间:2017-10-14 21:21:02

标签: java xml soap jaxb

我正在开发一个JAVA(Spring3)MW项目,该项目调用其他后端Web服务。但是,有些SOAP消息'''格式错误''''(我认为),我无法追查问题所在。

我不太清楚我应该包含哪些细节,但这里有一些可能很方便:它是一个使用Spring3的JAVA6项目,并且部署在Tomcat 8上用于测试目的。

这是一个类似于我的代码生成的消息的SOAP示例:

<S:Envelope 
    xmlns:S="http://schemas.xmlsoap.org/soap/">
 <S:Body xmlns="http://backend.company.com/">
   <GetCustomerInfo>
      <MsgHeader>
         <SomeTag>some value</SomeTag>
      </MsgHeader> 
      <Body>
         <CustomerId>123456</CustomerId>
      </Body> 
  </GetCustomerInfo>
</S:Body>
</S:Envelope>

当我将此SOAP消息发送到后端Web服务时,收到以下错误:

Exception: : Element must have a namespace specified if there is a default namespace in scope : Body

当我按如下方式更改消息时,一切都神奇地开始工作。唯一的区别是我为Soap body元素定义了命名空间。

<S:Envelope 
    xmlns:S="http://schemas.xmlsoap.org/soap/>
 <S:Body>
   <GetCustomerInfo xmlns="http://backend.company.com/">
      <MsgHeader>
         <SomeTag>some value</SomeTag>
      </MsgHeader> 
      <Body>
         <CustomerId>123456</CustomerId>
      </Body> 
  </GetCustomerInfo>
</S:Body>
</S:Envelope>

我有11个问题:

(1)我的初始消息与XML一致性有关吗?他们看起来都和我很相似。

(10)我的代码中的哪个库将我的JAVA对象转换为XML消息?我的配置中需要做哪些更改才能生成类似后一个示例的SOAP消息?

(11)在我的第一个XML文件中,我的第一个Body标签的“扩展名称”是什么?会是http://schemas.xmlsoap.org/soap/:Body还是http://backend.company.com/:Body

如果它是相关的,我的代码调用的服务类将使用以下标记进行注释:

@WebService(
    targetNamespace = "http://backend.company.com/",
    name = "MyServiceName"
)
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(
    parameterStyle = ParameterStyle.BARE
) 

1 个答案:

答案 0 :(得分:0)

行。终于找到了我的问题的答案。 Web应用程序将JAVA对象传递给JDK运行时库以进行解组。 JDK使用JDK运行时的JAX-WS RI来实际构建SOAP消息。

显然问题是由客户端和服务器之间的JDK版本不匹配引起的。

最初我使用JDK1.8启动了Tomcat,默认情况下JDK 1.8使用JAX-WS RI 2.2.9进行编组/解组。

另一方面,服务器使用的是JDK1.7,它使用JAX-WS RI 2.2.4来编组/解组SOAP消息。

当我切换到JDK1.7时,我的所有问题都解决了。

请注意,这与我们用于编译源代码的JDK无关,但与用于运行代码的运行时JDK版本有关。

BTW,这两条消息都是有效且功能相同的XML消息。只是早期版本不同意。