迁移到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时,我也遇到了这个问题。
答案 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.