是否可以使用 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.
<jaxb:javaType>
将不起作用,因为它只能用于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 类型(作为我的构建过程的一部分)。我不介意编写适配器,但我想避免必须预先实现生成模式的类(链接示例中的MyHashMapType
和 MyHashMapEntryType
)因为这对我来说是倒退的。这可能吗?
我认为这不是绝对必要的,很可能只是扩展示例。我知道我们过去只使用架构、绑定自定义文件和适配器来完成它。
一个XmlAdapter
是XJC 应该使用@Zach 的.xjb
配置生成的。
试试<xjc:javaType />
,见[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?的主要内容,如果未能解决你的问题,请参考以下文章