【问题标题】:wsimport client - customise multiple package nameswsimport 客户端 - 自定义多个包名
【发布时间】:2015-01-05 12:37:53
【问题描述】:

我正在使用 wsimport 为 JAX-WS Web 服务调用生成客户端存根

wsimport-p 选项,允许自定义包的名称。

例如。如果 WSDL 的命名空间为 com.abc,那么您可以通过使用 -p com.pqr 命令行调用 wsimport 将 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 - 它们位于不同的模式中。这有什么帮助?
  • 将它们放在单独的文件中意味着您不必处理混乱的 Xpath 或在 WSDL 中溢出一堆 jax-b 绑定指令
  • 你有没有尝试过这个?

标签: java web-services wsdl jax-ws wsimport


【解决方案1】:

通常,您使用 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 元素。 &lt;jaxb:package/&gt; 将定义输出包的名称。

然后您应该使用 -b 指令将绑定文件提供给 wsimport,这样就可以了

参考:

【讨论】:

    【解决方案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放到"C:\YOUR\PATH\TO\PLACE\THE\PACKAGES"

    如果你在没有 -keep -verbose 的情况下运行它,它只会生成包而不是 .java 文件。

    -b 将确保在生成时使用 schema.xjc

    【讨论】:

    • 请注意,此示例给出“[错误] 用于此模式的包名称 'your.package.name.schema2' 不是有效的包名称。”原因是“包”在java中是一个受限词。例如,使用 'your_package_name.schema2' 该示例运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多