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

17
我有一个现有的XML模式,其中包含一个类型,我想使用JAXB将其映射到某种Java Map。我的构建过程获取模式并创建bean。我想通过使模式中的一个complexType映射到java.util.Map来自定义此过程。我曾经在某个地方读到过JAXB“无法执行接口”的说法。我不确定是否适用于这种情况,但如果是,我可以将其映射到HashMap中。此外,它不一定必须是映射到Map的complexType,如果需要,它可以是元素。
我使用.xjb文件控制我的JAXB生成,因此我正在寻找一些放在其中。我尝试了以下内容,但它不起作用:
<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.

<jaxb:javaType>无法使用,因为它只能用于在XML Schema原语和Java类型之间进行映射。由于我想要在复杂类型和Java类型之间进行映射,所以我不能使用它。


你的 .xjb 方法是正确的,应该可以工作。XJC 是忽略它还是生成了错误的东西? - skaffman
使用上述 .xjb 方法,我在 jaxb 编译过程中遇到以下错误:[jaxb] [ERROR] 编译器无法遵守此 javaType 定制。它连接到了错误的位置,或与其他绑定不一致。 - Zach
2个回答

10
您的XJC文件正在使用 "标准" javaType 指令,我相信它只能将字符串值转换为代表Java类型的形式,并适用于转换简单元素和属性内容。XJC工具提供了增强版的javaType指令,理论上应该能够处理更复杂的结构。不幸的是,这还没有被实现:https://java.net/jira/browse/JAXB-209 (未解决)。例如,能够将模式类型映射到HashMap可能是使用模型驱动设计/实现的人们的一个常见需求。但是,目前似乎还无法做到这一点,因此必须手动编辑生成的代码。看起来你运气不好。

我本来希望这不是答案,但很高兴知道我没有错过什么。 - Zach

6

1
嘿,这看起来非常接近我想要做的事情!唯一的问题是,我正在使用模式来生成Java类型(作为我的构建过程的一部分)。我不介意编写适配器,但我希望避免必须预先实现生成模式的类(链接示例中的<code>MyHashMapType</code>和<code>MyHashMapEntryType</code>),因为这对我来说是倒退的。这可能吗? - Zach
我认为这并不是必须的,很可能只是一个扩展示例。我知道我们过去只用模式、绑定自定义文件和适配器就完成了它。 - maximdim
2
“XmlAdapter”是XJC应该使用@Zach的“.xjb”配置生成的内容。 - skaffman
尝试使用 <xjc:javaType />,请参见[http://jaxb.java.net/2.1.2/docs/vendorCustomizations.html#javaType]。 - xmedeko

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