我正在使用wsimport为JAX-WS webservice调用生成客户端存根
wsimport
具有-p
选项,允许自定义包名称。
例如。如果WSDL具有com.abc的命名空间,则可以通过使用wsimport
命令行调用-p com.pqr
来通过com.pqr替换com.abc。
但是,只有在wsdl中只使用一个命名空间时,这才能正常工作 如果wsdl中有多个名称空间,是否有办法用不同的包名替换每个名称空间。
例如。如果我想让命名空间com.abc.s1替换为命名空间com.pqr.s1&命名空间com.abc.s2将被命名空间com.pqr.s2替换。
如果我使用wsimport -p com.pqr.s1
,它会将所有生成的类放入com.pqr.s1
有没有办法达到我想要的目的?
答案 0 :(得分:4)
通常,您使用jax-b绑定文件来自定义给定XSD或WSDL的解组过程。绑定语言提供<package/>
指令,用于自定义生成的模式包。
给定单独的模式,在单独的文件中,您可以拥有一个看起来像这样的复合绑定文件:
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.0">
<jaxb:bindings schemaLocation="Flight.xsd" node="/xsd:schema">
<jaxb:schemaBindings>
<jaxb:package name="travel.flight"/>
</jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="Hotel.xsd" node="/xsd:schema">
<jaxb:schemaBindings>
<jaxb:package name="travel.hotel"/>
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>
schemaLocation
将引用各个模式文件的位置,node
指的是绑定声明应该应用于的XML元素。 <jaxb:package/>
将定义输出包的名称。
然后你应该使用-b
指令将绑定文件提供给 wsimport ,你应该没问题
参考:
答案 1 :(得分:2)
我这样做的方法是做以下几点。
首先创建一个schema.xjc文件
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.0">
<jaxb:bindings schemaLocation="YOUR_URL?wsdl#types?schema1">
<jaxb:schemaBindings>
<jaxb:package name="your.package.name.schema1"/>
</jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="YOUR_URL??wsdl#types?schema2">
<jaxb:schemaBindings>
<jaxb:package name="your.package.name.schema2"/>
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>
包名称可以是您想要的任何名称,只要它不包含Java中的任何保留关键字
接下来,您必须创建wsimport.bat脚本以在首选位置生成打包和代码。
cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES
wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl
pause
如果您不想使用cd,可以将wsimport.bat放入&#34; C:\ YOUR \ PATH \ TO \ PLACE \ THE \ PACKAGES&#34;
如果你在没有-keep -verbose的情况下运行它,它将只生成包而不生成.java文件。
-b将确保在生成
时使用schema.xjc