【问题标题】:JAXB binding - "unable to honor this conversion customization"JAXB 绑定 - “无法接受此转换自定义”
【发布时间】:2014-08-07 13:16:38
【问题描述】:

我在架构中有自己的 complexType,它应该在 XML 中看起来像这样:

<dynamic-content language-id="en_US"><!--[CDATA[256]]--></dynamic-content>

因此,包含一些文本的元素总是包含在 CDATA 中并具有属性。这是我目前在 article-content.xsd 中所做的:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ibacz.eu/veraext/xsd"
xmlns:tns="http://www.ibacz.eu/veraext/xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:complexType name="cdata">
        <xs:attribute name="language-id" type="xs:string" />
    </xs:complexType>

    <xs:element name="root"> 
        <xs:complexType>
            <xs:sequence>
                <xs:element name="dynamic-element" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:sequence>
                        <xs:element name="dynamic-content" type="tns:cdata" />
                    </xs:sequence>
                    <xs:attribute name="name" type="xs:string" />
                    <xs:attribute name="index" type="xs:integer" />
                    <xs:attribute name="type" type="xs:string" />
                    <xs:attribute name="index-type" type="xs:string" />
                  </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="available-locales" type="xs:string" />
            <xs:attribute name="default-locale" type="xs:string" />
        </xs:complexType>
    </xs:element>
</xs:schema>

bindings.xsd

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
           version="2.1">

    <jaxb:bindings schemaLocation="article-content.xsd" node="/xs:schema">
        <jaxb:bindings node="xs:complexType[@name='cdata']">
            <xjc:javaType name="String" adapter="eu.ibacz.veraext.backofficebridge.core.util.AdapterCDATA"/>
        </jaxb:bindings>
    </jaxb:bindings> 

</jaxb:bindings>

我摆脱不了的是compiler was unable to honor this conversion customization. It is attached to a wrong place, or its inconsistent with other bindings.

请问我该怎么办?我与这个问题斗争了好几个小时,这对我来说是一个真正的障碍。

【问题讨论】:

  • 适配器的用途是什么?您将哪些类用作XmlAdapter&lt;ValueType,BoundType&gt; 的泛型参数?
  • @laune - 目的是用 CDATA 标签包装/解包字符串,我正在使用
  • 这不是必需的。底层 XML 编写器负责按照 XML 规则以某种方式呈现任何内容。如果所有内容都正确转义,则不需要 CDATA 标记。或者,换个角度看,没有办法强制使用 CDATA 标记,这只是为了方便使用普通的旧文本编辑器输入内容。
  • @laune - 但我正在解决一个有点不同的问题:我一方面使用标准化数据(我可以 100% 确定会有 CDATA 标签)另一方面工作无法(几乎肯定不会)逃脱的导入。
  • 我认为您不了解与 CDATA 标记、JAXB 和编组相关的规则。当您将 String 存储到 Java 类的某个属性中时,它包含 char 值,并且无论字符或编码如何,它们都将使用正确的转义和编码写入输出。如果您尝试巧妙地存储包含在 CDATA 标记中的字符串值,则 they 以及这些标记之间的其他字符将被转义。绝对没有办法改变它 - 除非使用 println 编写 XML 文件:然后你就靠你自己了。

标签: xml data-binding jaxb xsd


【解决方案1】:

作为部分答案,您需要按如下方式修复您的 cdata 类型,以便您可以拥有文本内容:

    <complexType name="cdata">
        <simpleContent>
            <extension base="string">
                <attribute name="language" type="string"/>
            </extension>
        </simpleContent>
    </complexType>

我不确定您需要在绑定文件中定位哪个节点,但您可以尝试simpleContent

【讨论】:

  • 感谢您的回复,但是当我按照您的建议更改类型时,我会收到 Unexpected &lt;simpleContent&gt; appears at line 7 column 24.
  • @MartinDulak - 您需要添加 xs 前缀以匹配 XML Schema 中的命名空间限定。
  • 这就是你可以看出我已经厌倦了解决这个问题的方式。 :) 好的,现在当我将绑定更改为node="xs:complexType[@name='cdata']/xs:simpleContent" 我得到&lt;javaType&gt; customization in this context must be nested (JAXB spec sec 6.8.1)
  • 可能应该删除整个问题+答案(由于 Q 下面的 OPs 最终声明)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多