2017-10-14 31 views
1

我正在致力於調用其他後端Web服務的JAVA(Spring3)MW項目。但是,有些SOAP消息是'''格式不正確''(我認爲),我無法追蹤問題所在。什麼庫確定SOAP消息如何序列化?

我不太知道什麼細節我應該包括,但這裏是一些可能會派上用場:它是一個項目的Java6使用Spring3,並部署在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

當我改變我的消息如下,一切魔術開始工作。唯一的區別是我爲我的肥皂主體元素定義了命名空間。

<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文件,這將是「擴展名」我的第一主體標籤?它會是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 
) 
+0

由於body來自soap ns,所以第一個XML確實是錯誤的。所以第二個XML是正確的,你的WS服務器應該生成正確的soap消息 – Optional

+0

@Namphibian:實際上不是...'''backend.company。這兩個片段中的com'''命名空間僅定義了默認命名空間,這應該適用於所有沒有明確命名空間前綴的子元素。因此,在這兩種情況下,我自定義的'''backend.company.com'''命名空間僅適用於子元素,而不適用於''''元素(因爲它已經有一個給定的顯式名稱空間) – gok

+0

好的然後。我更喜歡自上而下,所以可能會錯過一些東西 – Namphibian

回答

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,我所有的問題都解決了。

需要注意的是,這有沒有關係這是我們用來comppile源代碼的JDK,但涉及到用來運行代碼運行時的JDK版本。

順便說一句,這兩個消息是有效的,功能相當的XML消息。只是早期版本不同意。