gpt4 book ai didi

java - wsimport 结果具有不同的运行时端点

转载 作者:行者123 更新时间:2023-12-01 11:30:56 28 4
gpt4 key购买 nike

这很奇怪。

我正在使用 maven 的 wsimport 插件生成肥皂服务的客户端代码,如下所示...

        <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 并打包生成的类时,也会出现同样的问题,因此我认为 maven 的使用不是问题的根源。

最佳答案

是的,我正在回答我自己的问题。我这样做是为了将来遇到此问题的任何人的利益。

我刚刚收到托管服务的人员的回复,我一直在尝试使用神秘变化的端口连接该服务。

他们的服务器“...在我们的内部网络上的端口 8080 和 8443 上运行,并使用具有端口转换的 NAT 从外部进行访问。因此,WSDL 文件中显示的端口是服务器(未知)已知的端口”

所以我们有了它。可用于抓取 wsdls 的端口可能不可用于服务调用。这不是很奇怪吗?

关于java - wsimport 结果具有不同的运行时端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30392596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com