JAXB 绑定文件:XmlAdapters 和包名称

2022-09-02 23:35:42

我有一个这样的绑定文件

<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <jxb:bindings schemaLocation="example.xsd" node="/xs:schema">
    <jxb:schemaBindings>
        <jxb:package name="example" />
    </jxb:schemaBindings>
    <jxb:globalBindings>
        <jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
            parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
            printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
        <jxb:javaType name="java.util.Calendar" xmlType="xs:date"
            parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
            printMethod="javax.xml.bind.DatatypeConverter.printDate" />
        <jxb:javaType name="java.util.Calendar" xmlType="xs:time"
            parseMethod="javax.xml.bind.DatatypeConverter.parseTime"
            printMethod="javax.xml.bind.DatatypeConverter.printTime" />
    </jxb:globalBindings>

  </jxb:bindings>
</jxb:bindings>

架构类是在“example”(正确)中生成的,但 XmlAdapters 在 “org.w3._2001.xmlschema” 中生成(错误)。我该如何解决这个问题?


答案 1

对于 Apache CXF 用户,最干净的方法是使用 .-pwsdl2java

-p [wsdl-namespace=]PackageName

指定零个或多个要用于生成的代码的包名称。(可选)指定 WSDL 命名空间到包名称的映射。

在我们的例子中

-p http://www.w3.org/2001/XMLSchema=org.acme.foo

如果您使用 cxf-codegen-plugin,则只需添加另一对 .<extraarg>

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
        [...]
    <extraarg>-p</extraarg>
    <extraarg>http://www.w3.org/2001/XMLSchema=org.acme.foo</extraarg>
        [...]
</plugin>

不需要指向保留的 XSD 命名空间的 targetNamespace,也不需要 catch-all jaxb 包绑定。


答案 2

在这里创建包是因为 XJC 必须生成一个扩展的类,该类反过来调用您的解析/打印静态方法。出于某种原因,它将它们放入此包中,而不是放在更有用的地方。org.w3._2001.xmlschemajavax.xml.bind.annotation.adapters.XmlAdapter

您还没有说明使用哪个 JAXB 实现,但是 JAXB RI 具有绑定自定义的扩展,它允许您直接指定 /pair 的子类。这样就无需生成合成桥接类。有关如何执行此操作,请参阅 RI 文档javaTypeXmlAdapterparseMethodprintMethodXmlAdapter

我想EclipseLink/Moxy有类似的东西,但我不确定Java6附带的XJC是否有能力(Sun似乎在将它带入JRE时从RI中删除了一半的有用东西)。


推荐