迁移到Java8和JAXB 2为引用简单类型的元素添加了@XmlSchemaType(name =“anySimpleType”)注释

时间:2015-10-16 13:41:29

标签: java xml jaxb annotations

迁移到Java8和JAXB 2为引用类型添加@XmlSchemaType(name =“anySimpleType”)注释

一旦我的项目升级到Java 8和JAXB 2,我就开始面临一个奇怪的问题。 我有枚举列表,双打作为我的XSD的一部分。 我曾经用以下方式定义它们。

<xs:complexType name="TOCForResultCType">
    <xs:sequence>
        <xs:element name="SupportedPPType" minOccurs="0" type="PPType">
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="PPType">
    <xs:list itemType="PostProcessingTypeSType"/>
</xs:simpleType>

<xs:simpleType name="PostProcessingTypeSType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="ANIMATION"/>
        <xs:enumeration value="NONE"/>
    </xs:restriction>
</xs:simpleType>

迁移到java8和jaxb 2之后,它生成了像这样的代码

public class TOCForResultCType {

@XmlList
@XmlElement(name = "SupportedPPType")
@XmlSchemaType(name = "anySimpleType")
protected List<PostProcessingTypeSType> supportedPPType;

这里可以看到这个额外的注释@XmlSchemaType(name =“anySimpleType”)。 在尝试使用JAXB Marshaller编组内容时,此额外注释会创建ClassCastException。

当我们使用simpleType注释创建对象列表时,会发生此问题。 尝试以相同的方式创建List时,我也遇到了这个问题。

1 个答案:

答案 0 :(得分:0)

所以我已经找到了这个问题的解决方案,我在这里添加,因为它可以帮助其他一些受到打击的程序员。

此解决方案只是解决方法。 我在问题中列出,问题的来源是额外的注释@XmlSchemaType(name =“anySimpleType”)。当我使用Java 5和JAXB 1时,这个注释不习惯。 如果在解析XSD并从中生成JAXB类时,如果我们可以阻止此注释,它将解决问题。

方法是将简单类型定义为内联而不是引用类型。

以下是示例XSD

<xs:complexType name="TOCForResultCType">
    <xs:sequence>
        <xs:element name="SupportedPPType" minOccurs="0">
            <xs:simpleType>
                <xs:list itemType="PostProcessingTypeSType" />
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="PostProcessingTypeSType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="ANIMATION" />
        <xs:enumeration value="NONE" />
    </xs:restriction>
</xs:simpleType>

,生成的JAXB类将如下所示。

public class TOCForResultCType {

@XmlList
@XmlElement(name = "SupportedPPType")
protected List<PostProcessingTypeSType> supportedPPType;

此解决方案已在以下问题中列出 jaxb: strange class cast exception on enum list

因此,一旦这个额外的注释消失了,代码中就不会出现classcastexception。 但对我来说很难理解,因此我再次为此发布Q / A.