我有一个现有的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>
修改:我已经添加了有关上述绑定的更多细节,我已经尝试过了。它在模式编译期间生成以下错误:
[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>
无效,因为它只能用于mapping between XML Schema primitives and Java types。由于我想在复杂类型和Java类型之间进行映射,我不能使用它。
答案 0 :(得分:10)
您的XJC文件正在使用“标准”javaType
指令,我认为该指令仅限于将String值转换为代表性的java类型。因此,它仅适用于转换简单元素和属性内容。
XJC工具提供了javaType
的增强版本,理论上它应该能够处理更复杂的结构。不幸的是,这还没有实现:
https://java.net/jira/browse/JAXB-209(未解决)
例如,能够映射一个 HashMap的模式类型可能是一个 可能需要那些使用 模型驱动的设计/实现。 AFAICS,今天不可能。 因此,必须手动编辑 生成的代码。
看起来你运气不好。
答案 1 :(得分:6)
你看过这里的例子(HashMap的自定义映射): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html
我很害怕创建自定义XmlAdapter。