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

Zac*_*ach 17 java schema xsd jaxb

我有一个现有的XML模式,其中包含一个我希望使用JAXB映射到某种Java Map的类型.我的构建过程采用模式并创建bean.我想通过将我的架构映射中的一个complexTypes映射到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>
Run Code Online (Sandbox Code Playgroud)

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

[jaxb] [ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings.
Run Code Online (Sandbox Code Playgroud)

<jaxb:javaType>将无法工作,因为它只能用于XML Schema原语和Java类型之间映射.由于我想在复杂类型和Java类型之间进行映射,因此我无法使用它.

ska*_*man 10

您的XJC文件使用的是"标准" javaType指令,我认为该指令仅限于将String值转换为代表性的java类型.因此,它仅适用于转换简单元素和属性内容.

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

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

例如,能够将模式类型映射到HashMap可能是使用模型驱动设计/实现的人的可能要求.AFAICS,今天不可能.因此,必须手动编辑生成的代码.

看起来你运气不好.


max*_*dim 6

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

需要创建自定义XmlAdapter我很害怕.

  • 一个`XmlAdapter`是XJC应该使用@Zach的`.xjb`配置生成的. (2认同)