如何包含一个打包的WSDL以用于使用wsimport生成的Java类?

bdz*_*vel 8 java wsdl web-services wsimport

我来自C#所以我意识到我不能指望Java中存在很多(优秀的)可用性特性和功能,但我最近有点像这个Java项目,我根本无法想象这个.在C#/ .NET中,Web服务代理类和生成的数据契约是不可能的,但由于某种原因,Web服务的Java实现对我来说似乎并不合适.

这是交易......

我使用wsimport从.wsdl文件创建生成的.java文件.例如...

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin ".\wsdl\MyWSDL.wsdl"
Run Code Online (Sandbox Code Playgroud)

我注意到这个硬编码(输入那个短语几乎让我呕吐)"wsdlLocation"作为wsdl的当前位置("C:\ Users\ME\etc\wsdl\MyWSDL.wsdl").所以我把它拿出来:

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin -wsdllocation "NULL" ".\wsdl\MyWSDL.wsdl"
Run Code Online (Sandbox Code Playgroud)

现在,当我实例化生成的服务时......

MyService xyz = new MyService();
Run Code Online (Sandbox Code Playgroud)

我收到一个错误.有些东西沿着"找不到文件C:\ blahblah\Temp\NULL".好的......回到绘图板.在对此进行了一些调查后,我在Stack Overflow上发现了一篇帖子,其中讨论了使用"classpath:META-INF/WSDL.wsdl"作为wsdl位置.

"%JAVA_HOME%\bin\wsimport" ... -wsdllocation "classpath:WSDLs/MyWSDL.wsdl" ".\wsdl\MyWSDL.wsdl"
copy ".\wsdl\*" .\bin\WSDLs
cd bin
"%JAVA_HOME%\bin\jar" cf WebServiceProxies.jar *
Run Code Online (Sandbox Code Playgroud)

错误!

"Unknown protocol: classpath" 
Run Code Online (Sandbox Code Playgroud)

奇怪的是,Stack Overflow上的帖子被标记为答案.我想有可能在过去的两年中,一个不错的数量已经改变到不再支持"classpath:"的地步,或者有另一种方法可以做到这一点,但我无法弄清楚/找到答案.

好的,所以我需要回答几个问题之一(先谢谢!!!!我在这里疯了!).

  1. 有没有办法让它在运行时不需要WSDL?对于它的价值,我认为当我实例化对象时它需要这个BS.有什么方法可以抑制这个要求?也许如果我使用不同的工具......?

  2. 如果此代码无法在运行时不需要WSDL,那么如何让它从包中获取此WSDL?我在wsdllocation参数中放入什么来使其从JAR文件中加载WSDL?

Ger*_*gyi 1

由于运行时悲剧对 wsdl 的需求从未困扰过我,因此我对#1 没有答案。也就是说,无论如何,使用打包的wsdl 应该是最后的手段。我更喜欢使用已发布的 wsdl 端点。因此,实际的 wsdl 位置适用http(s)://host/name_of_service?wsdl于大多数托管框架或http(s)://host/name_of_service.wsdlspring-ws。

至于基于 java 的 Web 服务客户端编程的复杂性,让我向您展示我的一个基于 Maven 的项目的一小段摘录:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>2.6.1</version>
<executions>
    <execution>
        <id>generate-sources</id>
        <phase>generate-sources</phase>
        <configuration>
            <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
            <wsdlOptions>
                <wsdlOption>
                    <wsdl>https://XXXXXXXX/ws/loadsave?wsdl</wsdl>
                </wsdlOption>
            </wsdlOptions>
        </configuration>
        <goals>
            <goal>wsdl2java</goal>
        </goals>
    </execution>
</executions>
Run Code Online (Sandbox Code Playgroud)

也许我不太以 IDE 为中心,但它对我来说似乎很简单。Apache CXF 是最好的 Web 服务堆栈之一。(尽管对于文档,我使用 Fuse http://fusesource.com/docs/esb/3.5/fsf_se/JAXWSWSDLFirst.html。它基本上是 CXF 的更名,具有更好的文档。)

希望这能回答您的问题(至少部分)。

关于 java 的咆哮:除非必要,否则我不会使用 MS 工具,但这并不是因为我讨厌它们。我的工作在某种程度上推动我走向更大的项目,而且在高端(甚至中端)服务器上很少看到 .net 支持。这只是一个事实,这并不会让 java 比 .net 更好。但我很确定,如果我必须从事 MS 的工作,我会很快习惯它。所以我的建议是:庆幸你的工作给了你学习新东西的机会并珍惜它。最后,我想我们从事这个行业是因为我们喜欢学习新事物。