是否可以使用 JAXB 从模式映射到 java.util.Map?

Posted

技术标签:

【中文标题】是否可以使用 JAXB 从模式映射到 java.util.Map?【英文标题】:Is it possible to use JAXB to map from schema to a java.util.Map? 【发布时间】:2010-12-25 07:12:19 【问题描述】:

我有一个现有的 XML 模式,其中包含我想使用 JAXB 映射到某种 Java Map 的类型。我的构建过程采用架构并创建 bean。我想通过将模式中的一个复杂类型映射到 java.util.Map 来自定义此过程。我在某处读到 JAXB“不能做接口”。我不确定这是否适用于这种情况,但如果是这样,我可以将它映射到 HashMap。此外,它不一定是映射到 Map 的 complexType,如果需要,它可以是一个元素。

我使用 .xjb 文件控制我的 JAXB 生成,所以我正在寻找一些 <jaxb:bindings> 来放入其中。我尝试了以下方法,但它不起作用:

<jaxb:bindings schemaLocation="myschema.xsd" node="/xs:schema">
    <jaxb:globalBindings>
        <jaxb:serializable uid="1"/>
    </jaxb:globalBindings>
    <jaxb:schemaBindings>
        <jaxb:package name="com.myschema.client.types"/>
    </jaxb:schemaBindings>
    <jaxb:bindings node="//xs:complexType[@name='MapType']">
            <jaxb:javaType name="java.util.HashMap"
            parseMethod="com.myschema.common.MapConverter.parseObjectToMap"
            printMethod="com.myschema.common.MapConverter.printMapToObject" />
    </jaxb:bindings>
</jaxb:bindings>

编辑:我已经添加了关于我已经尝试过的上述绑定的更多细节。它在架构编译期间生成以下错误:

[jaxb] [ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings.

&lt;jaxb:javaType&gt; 将不起作用,因为它只能用于mapping between XML Schema primitives and Java types。由于我想在复杂类型和 Java 类型之间进行映射,所以我不能使用它。

【问题讨论】:

您的.xjb 方法是正确的,应该有效。 XJC 只是忽略它,还是它产生了错误的东西? 使用上述 .xjb 方法,我在我的 jaxb 编译中收到以下错误:[jaxb] [ERROR] 编译器无法接受此 javaType 自定义。它附加到错误的位置,或与其他绑定不一致。 【参考方案1】:

您是否看过这里的示例(HashMap 的自定义映射): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

恐怕需要创建自定义 XmlAdapter。

【讨论】:

嘿,这看起来非常接近我想要做的!唯一的事情是,我正在使用模式来生成 Java 类型(作为我的构建过程的一部分)。我不介意编写适配器,但我想避免必须预先实现生成模式的类(链接示例中的 MyHashMapTypeMyHashMapEntryType )因为这对我来说是倒退的。这可能吗? 我认为这不是绝对必要的,很可能只是扩展示例。我知道我们过去只使用架构、绑定自定义文件和适配器来完成它。 一个XmlAdapter 是XJC 应该使用@Zach 的.xjb 配置生成的。 试试&lt;xjc:javaType /&gt;,见[jaxb.java.net/2.1.2/docs/vendorCustomizations.html#javaType]【参考方案2】:

您的 XJC 文件正在使用“标准”javaType 指令,我认为该指令仅限于将字符串值转换为代表性的 java 类型。因此,它只适用于转换简单的元素和属性内容。

XJC工具提供了javaType的增强版,理论上应该可以处理更复杂的结构。不幸的是,这还没有实现:

https://java.net/jira/browse/JAXB-209(未解决)

例如,能够映射一个 HashMap 的模式类型可能是 对那些使用的人的可能要求 模型驱动的设计/实施。 AFAICS,这在今天是不可能的。 因此,必须手动编辑 生成的代码。

看来你运气不好。

【讨论】:

我希望这不是答案,但我很高兴知道我没有遗漏任何东西。

以上是关于是否可以使用 JAXB 从模式映射到 java.util.Map?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JAXB 从 XML 模式生成 Java 枚举?

C# 中的 Jaxb 等效项

C# 中的 Jaxb 等效项

使用 Xpath 表达式和 jaxb 解组 XML

我可以从类似于 jaxb 的 json 数据创建类吗

是否可以让Jackson ObjectMapper在Spring Boot应用程序中遵守JAXB XML注释?