如何将打包的WSDL包含到使用wsimport生成的Java类中?

8
我来自C#,我意识到在Java中不能期望有很多(优秀的)可用性功能和功能,但最近我被安排了一个Java项目,我就是无法弄清楚这个问题。在C#/.NET中制作Web服务代理类和生成数据契约非常容易,但由于某种原因,Java实现的Web服务似乎不太对劲。
下面是情况...
我使用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();

我遇到了一个错误,大概是说“找不到文件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上的帖子被标记为答案。我猜在过去的两年里,可能已经有相当多的变化,以至于“classpath:”不再受支持,或者有其他方法来解决这个问题,但我还没有能够找到答案。

好的,我有几个问题需要回答(提前感谢!!!我快要疯了!)。

  1. 是否有一种方法使其在运行时不需要WSDL?就我所知,当我实例化对象时需要它,我认为它是胡说八道。有什么方法可以抑制这种要求吗?也许如果我使用不同的工具会更好...?

  2. 如果此代码在运行时确实需要WSDL,则如何从包中获取它?我应该在wsdllocation参数中放置什么来加载JAR文件中的WSDL?


你的帖子非常非常长。我猜想很少有人能够读完整个帖子。 - Max
1
编辑过的帖子,通过去除怨言并整合一些试错内容,使其更短。 - bdzevel
使用NetBeans可以避免使用命令行工具,只需指向WSDL,它就会自动在META-INF\wsdl中创建一个副本,并将其放入包含项目的最终JAR文件中。(http://netbeans.org/kb/docs/websvc/jax-ws.html) - madth3
是的,这是我最初的做法。问题在于源代码控制会充满由com.blah.blah生成的Web服务Java文件。因此,想法是将所有这些生成的文件移动到另一个jar文件中。当我这样做时,我不能简单地将资源加载为"META-INF\wsdl"或"BLAH\BLAH"。它无法识别我正在尝试从.jar文件中获取.wsdl,并继续将其视为文件(在默认目录temp中查找)。 - bdzevel
(另外,无论Netbeans使用什么工具,都需要修补代码。它会创建3个额外的构造函数,这些构造函数是有问题的。) - bdzevel
1个回答

1

由于我从未遇到过需要在运行时使用wsdl的问题,因此我对第一个问题没有答案。话虽如此,使用打包的wsdl应该是最后的选择。我更喜欢使用已发布的wsdl端点。因此,大多数托管框架的实际wsdl位置将是http(s)://host/name_of_service?wsdl,而Spring-ws则为http(s)://host/name_of_service.wsdl

至于基于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 是最好的网络服务堆栈之一。(虽然我使用Fuse http://fusesource.com/docs/esb/3.5/fsf_se/JAXWSWSDLFirst.html 进行文档编写。这基本上是CXF重新打包,并具有更好的文档。)

希望这至少部分回答了您的问题。

关于Java rant:除非必须,否则我不使用MS工具,但并不是因为我讨厌它们。我的工作使我接触到更大型的项目,高端(甚至中端)服务器很少支持.net。这只是一个事实,不会使Java比.net更好。但我相信如果我不得不在MS上工作,我会很快适应它。所以我的建议是:为自己的工作提供了学习新知识的机会而感到高兴。最终,我想我们从事这项业务是因为我们喜欢学习新东西。


1
请记住,有些网络服务不会在URL上发布其WSDL。我们正在与UPS进行集成,这种情况就是如此。 - IcedDante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接