我来自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();
我收到错误。有些东西沿着“找不到文件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:”的地步,或者有另一种方法可以做到这一点,但我无法弄清楚/找到答案。
好的,所以我需要回答几个问题中的一个(提前谢谢!!!!我在这里疯了!)。
有没有办法让它在运行时不需要WSDL?对于它的价值,我认为它是B.S.当我实例化对象时它需要这个。有什么方法可以抑制这个要求?也许如果我使用不同的工具......?
如果此代码没有在运行时不需要WSDL的方法,我如何让它从包中获取此WSDL?我在wsdllocation参数中放入什么来使其从JAR文件中加载WSDL?
答案 0 :(得分:0)
由于wsdl-at-runtime-tragedy的需要从未打扰过我,所以我对#1没有答案。也就是说,使用打包的 wsdl应该是最后的手段。我更喜欢使用已发布的wsdl端点。因此,对于大多数托管框架,实际wsdl位置为http(s)://host/name_of_service?wsdl
,对于spring-ws,实际wsdl位置为http(s)://host/name_of_service.wsdl
。
至于基于java的webservice客户端编程的复杂性,让我向你展示我的一个基于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 rant的:除非必须,否则我不使用MS工具,但不是因为我讨厌它们。我的工作以某种方式推动我走向更大的项目,很少见到.net支持高端(甚至是中端)服务器。这只是一个事实,不会使java比.net好。但我很确定如果我必须研究MS的东西,我会很快习惯它。所以我的建议是:高兴你的工作让你有机会学到新东西并珍惜它。最后我们在这个行业,因为我们想学习新的东西。