我一直在尝试导入以下Web服务:http://soap.genome.jp/KEGG.wsdl with $ {JAVA_HOME}/bin/wsimport:
wsimport -version
JAX-WS RI 2.1.6 in JDK 6
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
parsing WSDL...
[WARNING] src-resolve: Cannot resolve the name 'soapenc:Array' to a(n) 'type definition' component.
line 19 of http://soap.genome.jp/KEGG.wsdl#types?schema1
[ERROR] undefined simple or complex type 'soapenc:Array'
line 19 of http://soap.genome.jp/KEGG.wsdl
(....)
Run Code Online (Sandbox Code Playgroud)
问题来自WSDL还是来自wsimport的实现?我应该使用其他工具吗?
谢谢
皮埃尔
尝试wsimport用于为SOAP端点生成客户端.WSDL和使用的所有XSD文件都是本地副本.
这是正在执行的命令:
wsimport ./bwWsdl.xml -p com.generated -Xnocompile -d ../src -extension -keep -XadditionalHeaders -B-XautoNameResolution
Run Code Online (Sandbox Code Playgroud)
这给出了这个错误:
[ERROR] Two declarations cause a collision in the ObjectFactory class.
line 16 of file:/schemas/newSchema.xsd
[ERROR] (Related to above error) This is the other declaration.
line 16 of file:/schemas/newSchema.xsd
Run Code Online (Sandbox Code Playgroud)
请注意,报告的碰撞的行号是相同的.
这是架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
version="2.004" id="OTA2003A2009A">
<xs:complexType name="TPA_ExtensionsType">
<xs:annotation>
<xs:documentation xml:lang="en">Description here.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:element name="TPA_Extensions" type="TPA_ExtensionsType">
<xs:annotation>
<xs:documentation xml:lang="en">More description here.</xs:documentation>
</xs:annotation>
</xs:element> …Run Code Online (Sandbox Code Playgroud) 我正在使用NetBeans,我有两个项目:
对于web服务,我使用的是带有混合内容元素的XSD.使用以下代码为JAXB导入添加绑定文件:
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc"
jaxb:version="2.0">
<jaxb:globalBindings generateMixedExtensions="true"/>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)
它生成了这段代码:
@XmlMixed
@OverrideAnnotationOf
protected List<Serializable> contentOverrideForED;
Run Code Online (Sandbox Code Playgroud)
我可以使用这个生成的代码,虽然它并不理想.
我的问题在于客户端,我已经为我生成和部署的webservice添加了一个Web服务引用,只在localhost上运行.
使用相同的绑定文件WSDL Customization: External Binding File不会产生content代码,也不会直接使用它作为选项Wsimport,也不会将其用作Jaxb option.我有一种感觉,这种设置在某种程度上被忽视了,但是怎么样?
为什么最初的JAXB生成包括它以及wsimport为什么不使用它?我有点困惑.
当我尝试使用wsimport命令提示符下面的命令时,它工作正常:
wsimport -d generated C:\Users\generated\wsdlfile.xml
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用wsimport如下时,它会抛出以下错误:
wsimport -d generated https://example.com/exampleService.svc?wsdl
Failed to read the WSDL document: https://example.com/exampleService.svc?wsdl, because 1) could not find the document; /2) the document could not be read; 3) the root element of the document is not <wsdl:definitions>.
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): At least one WSDL with at least one service definition needs to be provided.
Failed to parse the WSDL.
Run Code Online (Sandbox Code Playgroud)
我可以从浏览器访问URL,同样的事情是从其他系统(从我的PC)开始.可能是什么原因?
我正在尝试使用JDK-9为Intellij-Idea 2017.2.5(Webservices - >从wsdl生成代码...)生成wsdl的类存根
我得到这个异常,我想知道如何告诉intellij传递"--add-modules java.activation"来完成操作.
(我想我应该从命令行运行wsimport ...)
Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource
at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.<clinit>(RuntimeBuiltinLeafInfoImpl.java:461)
at com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.<init>(RuntimeTypeInfoSetImpl.java:65)
at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:133)
at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:85)
at com.sun.xml.bind.v2.model.impl.ModelBuilder.<init>(ModelBuilder.java:156)
at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:93)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:455)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:303)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:142)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1174)
at com.sun.tools.xjc.reader.xmlschema.bindinfo.BindInfo.getJAXBContext(BindInfo.java:335)
at com.sun.tools.xjc.reader.internalizer.SCDBasedBindingSet.apply(SCDBasedBindingSet.java:235)
at com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:541)
at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:269)
at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:95)
at com.sun.tools.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:142)
at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2244)
at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:191)
at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:137)
at com.sun.tools.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:391)
at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:204)
at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:179)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at com.sun.tools.ws.Invoker.invoke(Invoker.java:135)
at com.sun.tools.ws.WsImport.main(WsImport.java:57)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用客户端的WSDL文件,该文件对输入和输出消息使用相同的元素定义,但是我无法让JAX-WS/JAXB解组响应.
<wsdl:message name="invokeServiceRequest">
<wsdl:part element="impl:requests" name="multiRequestWrapper"/>
</wsdl:message>
<wsdl:message name="invokeServiceResponse">
<wsdl:part element="impl:requests" name="result"/>
</wsdl:message>
<wsdl:portType name="GCGatewayPortType">
<wsdl:operation name="requests">
<wsdl:input message="impl:invokeServiceRequest" name="invokeServiceRequest"/>
<wsdl:output message="impl:invokeServiceResponse" name="invokeServiceResponse"/>
</wsdl:operation>
</wsdl:portType>
Run Code Online (Sandbox Code Playgroud)
由于某种原因,wsimport生成的代码具有void返回,并且在收到响应时似乎不更新INOUT参数.
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.7-b01-
* Generated source version: 2.1
*/
...
@WebMethod
@RequestWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType")
@ResponseWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType")
public void requests(
@WebParam(name = "paramOne", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
Holder<String> paramOne, …Run Code Online (Sandbox Code Playgroud) 我正在尝试为访问WSDL描述的Web服务的Java应用程序编写一个模块.源WSDL直接从我认为是ASP.NET Web服务下载; 服务URL以.asmx扩展名结尾,在浏览器中查看服务URL显示可用于下载WSDL的链接.
对我而言,一个关键要求是能够在不重新编译的情况下切换服务URL.给我的URL显然是一个测试服务器,我知道在生产中我将获得一个生产URL使用.我还希望能够自己创建一个模拟服务器进行测试,并保留将来指定新URL的功能,而无需在移动服务时重新编译.实际上,我希望我们的应用程序的安装能够在不同的URL 实例化web服务的多个实例.
但我的概念似乎与wsimport工具为我做的事情不相符.继f1sh的答案在这里,我生成的Java代码从我用这个命令下载WSDL:
wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl
Run Code Online (Sandbox Code Playgroud)
我发现生成的代码对我下载的wsdlFile.wsdl有一个硬编码的引用,其中包含服务URL.我们的应用程序不会以通过在运行时编辑WSDL文件来配置它的方式运行.我需要在构建时将代码编译到我的应用程序中,并且可以在实例化时设置服务URL.
我不完全确定为什么WSDL甚至需要在运行时解析; 我的理解是WSDL提供了足够的信息来生成可以访问web服务的代码,所以我不确定它为服务URL以外的生成代码提供了什么,我不知道为什么服务URL没有提供构造函数或可通过生成的Web服务类上的方法进行配置.我肯定错过了什么.
这种情况的一般做法是什么?大多数人会为他们将要使用的每个URL重新生成代码吗?代码是在运行时生成的吗?是否有另一个我可以使用的WSDL工具,它将使用可配置的URL构建客户端代码?
有人可以告诉我在哪里下载以及如何安装JAX-WS wsimport工具吗?我需要下载并安装它.
实际上我想在我的代码中使用SOAP webservices,我需要JAX-WS wsimport工具.我的谷歌搜索对我没什么帮助.
每次我运行wsimport,我都会收到此错误:
[错误]"不支持使用SOAP编码.文件中第65行的SOAP扩展元素:dummy.wsdl has use ="encoded""无法解析WSDL.
WSDL(错误块):
<wsdl:input name="dummyRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:cmg.stdapp.webservices.generalplugin" use="encoded" />
</wsdl:input>
Run Code Online (Sandbox Code Playgroud) 对于具有多个Web服务(多个WSDL)的项目,我们使用自上而下的方法.每个Web服务都需要设置为单独的项目,并作为单独的战争部署.
问题是WSDL共享一些常见的.xsd文件.目前,如果我们为每个WSDL运行wsimport,则每个Web服务项目中都会复制常见的JAXB类.
理想情况下,我们希望在公共共享项目中单独生成JAXB类,然后在每个Web服务项目中重用JAXB类项目,但wsimport不提供跳过JAXB类生成或指定其他位置的选项对于JAXB类.
关于如何在不同的JAX-WS Web服务端点之间共享JAXB类的任何想法?