wsimport客户端 - 自定义多个包名称

8
我正在使用wsimport生成JAX-WS的客户端存根进行webservice调用。wsimport带有“-p”选项,该选项允许自定义包名称。例如,如果WSDL的命名空间为com.abc,则可以通过在调用wsimport时使用“-p com.pqr”命令行来将com.abc替换为com.pqr。
但是,仅当wsdl中仅使用一个命名空间时才有效。如果wsdl中有多个命名空间,请问是否有一种方法可以将每个命名空间替换为不同的包名称。
例如,我想将命名空间com.abc.s1替换为命名空间com.pqr.s1,并将命名空间com.abc.s2替换为命名空间com.pqr.s2。如果我使用“wsimport -p com.pqr.s1”,它会将所有生成的类放入com.pqr.s1。
请问如何实现我的要求?

可以使用自定义的JAXB绑定来实现。请在此处发布您的WSDL(或类似内容)。理想情况下,您的各种模式应该在单独的XSD中,但我假设您没有这样做。 - kolossus
@kolossus - 它们在不同的模式中。那有什么帮助吗? - user93353
将它们放在单独的文件中意味着您不必处理 Xpath 的混乱或在 WSDL 中泄漏一堆 jax-b 绑定指令。 - kolossus
你有没有试过这个? - kolossus
2个回答

7

通常,您可以使用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,这样就可以了。

参考:


4
我来翻译这段内容。这里是一种处理方法,就是按照以下步骤进行。
首先,创建一个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放在“C:\YOUR\PATH\TO\PLACE\THE\PACKAGES”中。

如果没有使用-keep -verbose运行它,则只会生成包而不是.java文件。

-b选项将确保使用schema.xjc进行生成。


1
请注意,此示例会出现“[ERROR] The package name 'your.package.name.schema2' used for this schema is not a valid package name.”的错误。原因是“package”是Java中的受限关键字。例如,使用“your_package_name.schema2”就可以正常运行示例。 - riskop

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