wsimport 结果具有不同的运行时端点
wsimport result has a different runtime endpoint
这很奇怪。
我正在像这样使用 maven 的 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 url 上。
奇怪的是,如果我像这样手动更改服务端点...
((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 位置而不是本地位置。
插件的更改以与我原来的问题相同的方式生成 类,在反编译时都指向正确的主机端口和路径,并且都仍然出现相同的默认端口问题到 8080.
* 已更新 *
当我从命令行手动 运行 wsimport 并 jar 生成结果 类 时,同样的问题发生了,所以我认为使用 maven 不是问题的根源。
尝试使用 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>
是的,我正在回答我自己的问题。我这样做是为了将来遇到此问题的任何人的利益。
我刚刚收到托管服务的人员的回复,我一直在尝试连接神秘变化的端口。
他们的服务器“...运行 在我们内部网络的端口 8080 和 8443 上,并且可以使用带端口转换的 NAT 从外部访问。因此,WSDL 文件中显示的端口是那些( un) 为服务器所知。"
好了。可用于获取 wsdls 的端口可能无法用于服务调用。是不是很奇怪?
这很奇怪。
我正在像这样使用 maven 的 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 url 上。
奇怪的是,如果我像这样手动更改服务端点... ((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 位置而不是本地位置。
插件的更改以与我原来的问题相同的方式生成 类,在反编译时都指向正确的主机端口和路径,并且都仍然出现相同的默认端口问题到 8080.
* 已更新 *
当我从命令行手动 运行 wsimport 并 jar 生成结果 类 时,同样的问题发生了,所以我认为使用 maven 不是问题的根源。
尝试使用 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>
是的,我正在回答我自己的问题。我这样做是为了将来遇到此问题的任何人的利益。
我刚刚收到托管服务的人员的回复,我一直在尝试连接神秘变化的端口。
他们的服务器“...运行 在我们内部网络的端口 8080 和 8443 上,并且可以使用带端口转换的 NAT 从外部访问。因此,WSDL 文件中显示的端口是那些( un) 为服务器所知。"
好了。可用于获取 wsdls 的端口可能无法用于服务调用。是不是很奇怪?