2016-03-03 37 views
1

我們在JBoss EAP 6.4.0(JBoss AS 7.5.0)的WAR中部署了一個JAX-WS webservice,它提供了預定義的WSDL和XSD:如何防止JBoss將JAX-WS XSD導入URL重寫爲HTTP

@WebService(endpointInterface = "package.MyPortType", 
    targetNamespace = "http://target.name.space", 
    wsdlLocation = "/WEB-INF/classes/myService.wsdl", 
    serviceName = "myService", 
    portName = "myServicePort") 
public class MyService implements MyPortType { 
... 
} 

JBoss的正確部署Web服務併發布給定的WSDL爲 http://localhost:8080/myApp/myServicehttp://localhost:8080/myApp/myService?wsdl

我們遇到在於WSDL中的XSD進口的問題。在最初的WSDL,它看起來像:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" ...> 
<types> 
    <xsd:schema targetNamespace="http://target.name.space"> 
     <xsd:import namespace="http://target.name.space" 
      schemaLocation="mySchema.xsd" /> 

但JBoss的重寫這

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" ...> 
<types> 
    <xsd:schema targetNamespace="http://target.name.space"> 
     <xsd:import namespace="http://target.name.space" 
      schemaLocation="https://localhost:8443/myApp/myService?xsd=mySchema.xsd" /> 

這不起作用,因爲我們既沒有HTTPS的連接器也HTTPS入standalone.xml插座綁定定義。所以JBoss運行時沒有任何HTTPs連接。 我們沒有任何關於Web服務部署的其他配置文件。

爲什麼進口改寫成這樣一種錯誤的方式,我們如何防止這種情況發生?

回答

1

從JAX-WS規範:

JAX-WS實現必須修補的所有wsdl:import並指向本地文檔本地文檔xsd:import聲明的位置屬性...

...請注意,雖然目錄設施(見4.4)用於解決在處理根描述文檔時遇到的任何絕對URL或通過wsdl:importxsd:import語句可以從它們傳遞到的任何文檔,但那些當導入文檔發佈時,絕對URL不會被重寫,因爲通過目錄解析的文檔不被視爲本地,即使目錄將其映射到與應用程序一起打包的資源。

所以,你必須爲什麼位置被改​​寫,特別是因爲XSD是本地的。

爲避免重寫,您需要在原始WSDL的schemaLocation字段中指定您選擇的絕對URL。

至於爲什麼錯誤地重寫位置?在JBoss issue board上有some喋喋不休,這可能表明您的JAX-WS實現中存在一個錯誤