这是一个奇怪的。
我正在使用wsimport插件为Maven生成肥皂服务的客户端代码...
<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;
}
...到目前为止一切都很好。该构建将创建一个jar,其中仅包含从wsimport生成的已编译代码。
但是,当我在代码中引用此生成的客户端来调用服务时,端点就不同了!这是我的工作重点
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()。put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,“ theCorrectUrlAndPort”)
...一切正常,我可以愉快地访问远程服务。
我错过了明显的事情吗?我假设给wsimport wsdl位置可以将正确的端点烘焙到客户端代码中,并且在主机和路径数据正确但端口错误的情况下,它看起来肯定是正确的。
也许我用wsimport插件做了一些愚蠢的事情?也许我需要在wsimport中提供端口吗?
感谢您提供的任何建议。
编辑
根据Leo的建议,这是新的插件配置...
<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位置,而不是本地的wsdl位置。
更改插件后,生成类的方式与我原来的问题相同,在反编译时,它们均指向正确的主机端口和路径,并且仍然存在将端口默认设置为8080的相同问题。
* 更新 *
当我从命令行手动运行wsimport并封装生成的类时,会发生相同的问题,因此我认为使用maven并不是问题的根源。
最佳答案
是的,我正在回答自己的问题。我这样做是为了将来遇到此问题的任何人的利益。
我刚刚从托管我一直在尝试与神秘变化的端口连接的服务的家伙那里听到。
他们的服务器“ ...在内部网络上的端口8080和8443上运行,并且可以使用带有端口转换的NAT从外部访问。因此,WSDL文件中显示的端口是服务器(未知)的那些端口。”
因此,我们有它。可用于捕获wsdls的端口可能不适用于服务调用。那不是很奇怪吗?
关于java - wsimport结果具有不同的运行时端点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30392596/