這是一個奇怪的問題。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起來所得到的類會發生同樣的問題,所以不認爲使用的行家是問題的根源。
我會盡力的。您提供的示例假定使用本地wsdl,因此我將換出wsdlUrls的wsdlFile/Directory節點。我也嘗試使用wsimport從命令行而不是通過maven生成類,所以我使用的maven插件可能不相關,但我願意嘗試任何操作。 –
...掛上,我在這裏錯過了什麼?我爲什麼要生成一個wsdl?您是否建議我採用我生成的源代碼,從中生成wsdl,然後重新生成代碼? –
單獨使用wsimport執行從指定的wsdl生成客戶端。 –