对于具有多个Web服务(多个WSDL)的项目,我们使用自上而下的方法.每个Web服务都需要设置为单独的项目,并作为单独的战争部署.
问题是WSDL共享一些常见的.xsd文件.目前,如果我们为每个WSDL运行wsimport,则每个Web服务项目中都会复制常见的JAXB类.
理想情况下,我们希望在公共共享项目中单独生成JAXB类,然后在每个Web服务项目中重用JAXB类项目,但wsimport不提供跳过JAXB类生成或指定其他位置的选项对于JAXB类.
关于如何在不同的JAX-WS Web服务端点之间共享JAXB类的任何想法?
我在创建Java客户端并将其连接到正在运行的Web Service时遇到问题.
我使用以下代码:
Service myService = null;
URL wsdlLocation = new URL("http://myservice?wsdl");
QName serviceName = new QName(wsdlLocation, "MyService");
Service myService = new Service(wsdlLocation, serviceName);
Run Code Online (Sandbox Code Playgroud)
使用以下命令创建Service类的位置:
wsimport -d gen -keep http://myservice?wsdl
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用Apache cxf 2.4的wsdl2java生成的客户端,但得到了相同的结果.
(我已经在我使用原始代码的代码中更改了此帖子的WSDL位置和服务类名称.)
但是当我使用新的Service()命令创建服务时,我在appserver上调用Web Service时遇到异常.但是:我用SOAP UI测试了wsdl位置,它运行得很好.此外,我使用Soap UI创建了一个模拟服务,我的Java客户端可以连接到它,调用它并获得结果.当我想要调用在appserver上运行的Web服务时,会出现问题.
堆栈跟踪:
javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:149)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:98)
at javax.xml.ws.Service.<init>(Service.java:76)
at MyService.<init>(MyService.java:42)
at mypackage.createService(AClass.java:288)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:100)
at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:199)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:147)
... 12 more …Run Code Online (Sandbox Code Playgroud) 我正在使用ant wsimport从wsdls生成客户端存根.另外,我想生成实现的客户端类Serializable.我想serialVersionUID为每个班级生成一个不同的.我尝试使用下面显示的绑定文件.但它serialVersionUID为所有类生成相同.有什么方法可以把我自己serialVersionUID的每个班级都给自己?
<wsimport xendorsed="true" binding="binding.xml" debug="true" keep="true"
verbose="false" sourcedestdir="${generated}" wsdl="${src}${wsdl.file}"
wsdlLocation="${wsdl.file}">
</wsimport>
Run Code Online (Sandbox Code Playgroud)
绑定配置
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<globalBindings>
<serializable uid="1" />
</globalBindings>
</bindings>
Run Code Online (Sandbox Code Playgroud) 我WsImport用来从远程WSDL文件生成一些Java源代码.请注意,这是来自常规Scala项目,即它不是在Maven或Ant构建中完成的:
import com.sun.tools.ws.WsImport
def run(wsdlFile: File, destination: File, packageName: String = "generated"): Seq[File] = {
sys.props("javax.xml.accessExternalDTD") = "all"
sys.props("javax.xml.accessExternalSchema") = "all"
val xjcArgs = "" //TODO
val args = s"-Xnocompile -XadditionalHeaders $xjcArgs -J-Djavax.xml.accessExternalDTD=all -b http://www.w3.org/2001/XMLSchema.xsd -p $packageName -s $destination $wsdlFile"
WsImport.doMain(args.split(' '))
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作得很好,我用它从上面的Scala代码以编程方式生成Java WSDL客户端.
但是,现在,我还想使用一些WsImport插件(例如this和this):
val xjcArgs = "-B-Xequals -B-XhashCode -B-Xvalue-constructor"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:no such JAXB option: -Xequals即使我将以下内容添加到我的类路径中:
"org.jvnet.jaxb2_commons" % "jaxb2-basics" % "1.11.1",
"org.jvnet.jaxb2_commons" % "jaxb2-value-constructor" % "3.0",
Run Code Online (Sandbox Code Playgroud)
如何强制WsImport使用这些插件?或者我是否直接使用除WsImport(如ANT)之外的其他工具?
尝试使用ANT
我在com.sun.tools.ws.WsImport上面使用,但也有另一个 …
我部署了一个JAX-WS服务并使用wsimport生成客户端代码.因为我在localhost上运行wsimport,所以我在"localhost"地址上使用binind获取了客户端代码.
但我想在其他使用公共IP yyyy访问我部署的服务的计算机上重用这些客户端代码.如何动态使用这些(一次)生成的客户端代码来访问我的服务.(服务的IP可能会改变......)
我正在尝试使用wsimport生成一个webservice客户端,但wsdl需要身份验证.
我正在使用这样的命令:wsimport https:// username:password @ url?wsdl
但它不起作用.
我有一个使用相互SSL身份验证的Web服务.当我安装了客户端证书时,我可以在浏览器中正常访问它.
我需要能够使用它wsimport来生成访问服务的Java代码.
如何设置我的凭据以便我可以使用wsimport?
这是我正在尝试的一个例子,但由于无法进行身份验证而超时.
wsimport ./sample.wsdl -p com.company.ws.sample -Xnocompile -d ./src -extension -keep -XadditionalHeaders
谢谢你的帮助
编辑:
这就是wsimport印刷品.WSDL绝对有效,在给定的位置,这是一个确定如何传递我的凭据进行身份验证的问题:
wsimport https://wsdl.location.com?WSDL -p com.company.ws.sample -Xnocompile
-d ./src -extension -keep -XadditionalHeaders
parsing WSDL...
[ERROR] Received fatal alert: handshake_failure
Failed to read the WSDL document: "https://wsdl.location.com?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): …Run Code Online (Sandbox Code Playgroud) 我刚刚使用wdmport的jdk1.7生成了java源文件来构建Web服务客户端.
wsimport -keep /path/to/wsdl
Run Code Online (Sandbox Code Playgroud)
为了生成SOAP请求,我在生成的文件夹下使用了clasess.一切顺利,回复200 :)
但是,我想使用(为......'有趣')CXF(v.2.7)wsdl2java工具使其完全相同,但使用此工具它不会生成SOAP请求所需的类,它不会t创建生成的文件夹.
wsdl2java -keep -verbose /path/to/wsdl
Run Code Online (Sandbox Code Playgroud)
另外我注意到工具自己创建的类ObjectFactory是不同的.使用wsdl2java创建一个很短的文件.
那么,为什么这些工具会产生不同的结果?
我不明白这两者的区别,你能帮帮我吗?
使用的WSDL导入XSD文件,这有一个众所周知的问题,我已经解决了感谢这个博客条目 这里
感谢您的回答
我的gradle构建中有一个wsimport任务正常工作,直到Java 7:
task wsimport {
ext.destDir = file("${buildDir}/generated/java")
ext.wsdlSrc = file("src/main/resources/schema/example/my.wsdl")
ext.bindingSrc = file("src/main/resources/schema/example/bindings.xsd")
outputs.dir destDir
doLast {
ant {
destDir.mkdirs()
taskdef(name: 'wsimport',
classname: 'com.sun.tools.ws.ant.WsImport',
classpath: configurations.jaxws.asPath)
wsimport(keep: true,
package: 'net.example.my',
xnocompile: true,
quiet: true,
sourcedestdir: destDir,
wsdl: wsdlSrc,
binding: bindingSrc,
encoding: "UTF-8"
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
切换到JDK 8(build 1.8.0-b129)时,出现以下错误:
java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: ... schema_reference:
Failed to read schema document 'xjc.xsd', because 'file' access is not allowed due to restriction set by the accessExternalSchema property.
Run Code Online (Sandbox Code Playgroud)
搜索问题我发现了以下帖子(令人惊讶地描述了Java 7的问题):https://github.com/stianh/gradle-jaxb-plugin/issues/20 …
我当前正在开发一个需要wsimport的项目,但是我们使用的是JDK11,我刚刚发现从此版本开始,wsimport已从JDK中删除。
我搜索了答案,并尝试添加此依赖关系,但目前无法正常工作。
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.2.11</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
有什么我不知道的wsimport替代品吗?
谢谢 !