8

我来自 C#,所以我意识到我不能指望 Java 中有很多(很棒的)可用性特性和功能,但是我最近有点投入到这个 Java 项目中,我简直想不通这个出来。在 C# / .NET 中,制作 Web 服务代理类和生成的数据合同是件大事,但出于某种原因,Web 服务的 Java 实现对我来说似乎并不正确。

这是交易...

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

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin ".\wsdl\MyWSDL.wsdl"

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

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin -wsdllocation "NULL" ".\wsdl\MyWSDL.wsdl"

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

MyService xyz = new MyService();

我得到一个错误。类似于 "can't find file 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 *

错误!

"Unknown protocol: classpath" 

奇怪的是,Stack Overflow 上的帖子被标记为答案。我想在过去的两年中,可能有相当多的数量已经改变到不再支持“类路径:”的程度,或者有另一种方法可以做到这一点,但我无法弄清楚/找到答案.

好的,所以我有几个需要回答的问题之一(提前谢谢!!!!我要疯了!)。

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

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

4

1 回答 1

1

由于需要 wsdl-at-runtime-tragedy 从来没有打扰过我,所以我对 #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>

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

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

关于 Java 咆哮:除非必须,否则我不使用 MS 工具,但不是因为我讨厌它们。我的工作不知何故将我推向了更大的项目,而且在高端(甚至中端)服务器上看到 .net 支持非常罕见。这只是一个事实,它不会使 java 比 .net 更好。但我很确定如果我必须处理 MS 的东西,我会很快适应它。所以我的建议是:很高兴你的工作让你有机会学习并珍惜它。最后,我们从事这项业务是因为我想我们喜欢学习新事物。

于 2012-06-27T05:35:03.010 回答