2015-05-22 42 views
0

這是一個奇怪的問題。wsimport結果具有不同的運行時端點

我生成使用wsimport的插件這樣的行家SOAP服務客戶端代碼......

 <plugin> 
      <groupId>org.jvnet.jax-ws-commons</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
      <execution> 
       <goals> 
       <goal>wsimport</goal> 
       </goals> 
       <configuration> 
       <wsdlUrls> 
        <wsdlUrl>${testWsdlLocationUrl}</wsdlUrl> 
       </wsdlUrls> 
       <destDir>${basedir}/target/jaxws</destDir> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 

...在那裏我已經參數化的外部WSDLURL。我能看到的WSDL URL(捏造匿名)在這樣生成的客戶端定義...

static { 
    URL url = null; 

    try { 
     URL e = SpecialService.class.getResource("."); 
     url = new URL(e, "http://theUrlThatIDefinedAbove:withTheCorrectPortNumber/blahblah?wsdl"); 
    } catch (MalformedURLException var2) { 
     logger.warning("Failed to create URL for the wsdl Location: \'http://theUrlThatIDefinedAbove:withTheCorrectPortNumber/blahblah?wsdl\', retrying as a local file"); 
     logger.warning(var2.getMessage()); 
    } 

    SPECIALSERVICE_WSDL_LOCATION = url; 
} 

...所以一切看起來罰款爲止。構建會創建一個僅包含從wsimport生成的已編譯代碼的jar。

但是,當我在我的代碼中引用此生成的客戶端來調用服務時,端點是不同的!這裏是(主旨)我做什麼...

this.serviceEndpoint = new SpecialService().getSpecialServiceHttpSoap11Endpoint(); 

this.serviceEndpoint.callTheSpecialMethodOnTheService(withSomeDataOrOther)

夠簡單了吧?但是,我收到一個超時異常。

當我看到像這樣的服務端點:

System.out.println("Service Endpoint : " + this.serviceEndpoint.toString()); 

我得到(像)...

Service Endpoint : JAX-WS RI 2.2.4-b01: Stub for http://theCorrectUrlHere:8080/withTheCorrectPath/ 

...在哪裏8080從何而來?它不在我指定的wsdl網址上。

奇怪的是,如果我手動更改這樣的服務端點... ((BindingProvider)this.serviceEndpoint).getRequestContext()。把(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 「theCorrectUrlAndPort」)

...一切正常很好,我可以愉快地訪問遠程服務。

我錯過了一些明顯的東西嗎?我認爲給wsimport的wsdl位置會將正確的端點映射到客戶端代碼中,而且它肯定會以主機和路徑數據正確的方式來看,但端口是錯誤的。

我是否用wsimport插件做了一些愚蠢的事情?我是否需要在wsimport中提供端口?

如果您能提供任何建議,我將不勝感激。

編輯

繼獅子座的建議,這裏的新插件配置...

<testWsdlLocationUrl>http://editedOutHost:portThatIsNot8080/the/rest/of/the/path?wsdl</testWsdlLocationUrl> 

...

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>generate-stubs</id> 
        <phase>process-classes</phase> 
        <goals> 
         <goal>wsimport</goal> 
        </goals> 
        <configuration> 
         <wsdlUrls> 
          <wsdlUrl>${testWsdlLocationUrl}</wsdlUrl> 
         </wsdlUrls> 
         <wsdlLocation>${testWsdlLocationUrl}</wsdlLocation> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

請注意它指向一個遠程WSDL位置,而不是在你評論的例子中是本地的。

插件的改變以和我原來的問題相同的方式生成類,反編譯時都指向正確的主機端口和路徑,兩者仍然表現出將端口默認回8080的相同問題。

*更新*

當我手動從命令行運行的wsimport和JAR起來所得到的類會發生同樣的問題,所以不認爲使用的行家是問題的根源。

回答

1

是的,我回答我的問題的問題排序是有用的。我這樣做是爲了將來任何人遇到這個問題。

我剛剛聽到來自託管我一直試圖與神祕改變的港口連接的服務的人回來。

他們的服務器「...在端口8080和8443上運行在我們的內部網絡上,並且通過使用端口轉換的NAT進行外部訪問。因此,WSDL文件中顯示的端口是那些服務器。」

所以我們有它。可用於抓取wsdls的端口可能無法用於服務調用。這不是很奇怪嗎?

0

嘗試使用Codehaus的插件,將是相關的WSDL位置

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>jaxws-maven-plugin</artifactId> 
     <executions> 
      <execution> 
       <id>generate-wsdl</id> 
       <phase>process-classes</phase> 
       <goals> 
        <goal>wsgen</goal> 
       </goals> 
       <configuration> 
        <sei><!-- fully qualified class name goes here --></sei> 
        <genWsdl>true</genWsdl> 
       </configuration> 
      </execution> 
      <execution> 
       <id>generate-stubs</id> 
       <phase>process-classes</phase> 
       <goals> 
        <goal>wsimport</goal> 
       </goals> 
       <configuration> 
        <wsdlDirectory>target/jaxws/wsgen/wsdl</wsdlDirectory> 
        <wsdlFiles>     
         <wsdlFile><!-- class name goes here -->Service.wsdl</wsdlFile> 
        </wsdlFiles> 
        <!-- *** you need the next line to set the wsdlLocation in the generated stubs *** --> 
        <wsdlLocation>http://localhost:8080/test</wsdlLocation> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
+0

我會盡力的。您提供的示例假定使用本地wsdl,因此我將換出wsdlUrls的wsdlFile/Directory節點。我也嘗試使用wsimport從命令行而不是通過maven生成類,所以我使用的maven插件可能不相關,但我願意嘗試任何操作。 –

+0

...掛上,我在這裏錯過了什麼?我爲什麼要生成一個wsdl?您是否建議我採用我生成的源代碼,從中生成wsdl,然後重新生成代碼? –

+0

單獨使用wsimport執行從指定的wsdl生成客戶端。 –

相關問題