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

问题描述 投票:0回答:3

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

我使用 .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>
不起作用,因为它只能用于 XML 模式原语和 Java 类型之间的映射。因为我想在复杂类型和 Java 类型之间进行映射,所以我不能使用它。

java schema xsd jaxb
3个回答
10
投票

您的 XJC 文件正在使用“标准”

javaType
指令,我相信该指令仅限于在 String 值与代表性 java 类型之间进行转换。因此,它只适合转换简单的元素和属性内容。

XJC工具提供了

javaType
的增强版本,理论上应该能够处理更复杂的结构。不幸的是,这尚未实施:

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

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

看来你运气不好。


6
投票

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

恐怕需要创建自定义 XmlAdapter。


0
投票

非常老的问题,但当这个PR将被合并时,可能会有新的答案。

通过这个新的 PR,

xjc:javaType
现在将处理泛型类型。

它已经使用 jaxb-tools 的 maven-plugin 进行了测试,语法示例如下:

<jaxb:bindings node=".//xsd:attribute[@name='subRatings']">
  <jaxb:property>
    <jaxb:baseType>
      <xjc:javaType name="java.util.List&lt;java.lang.String&gt;" adapter="org.jvnet.jaxb.xml.bind.annotation.adapters.CommaDelimitedStringAdapter"/>
    </jaxb:baseType>
  </jaxb:property>
</jaxb:bindings>

生成的 java 类属性如下所示,不再有

import java.util.List<String>;
错误导入

@XmlAttribute(name = "subRatings")
@XmlJavaTypeAdapter(CommaDelimitedStringAdapter.class)
protected List<String> subRatings;

它修复了 jaxb-ri 存储库中的 #209#737 问题

© www.soinside.com 2019 - 2024. All rights reserved.