如何使用JAXB处理无效的枚举类型?

时间:2009-10-02 16:10:25

标签: java enums wsdl jaxb

我们正在使用JAXB来处理我们的wsdl验证。在wsdl中我们有一个类似的枚举:

<xs:simpleType name="myEnum">
    <xs:annotation>
        <xs:documentation>The enums which matter.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:enumeration value="MYENUM_1">
            <xs:annotation>
                <xs:documentation>MYENUM_1 is the first enum.</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value="MYENUM_2">
            <xs:annotation>
                <xs:documentation>MYENUM_2 is the second enum.</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
    </xs:restriction>
</xs:simpleType>

如果我们传入一个无效字符串作为枚举,例如MYENUM_7,则该值设置为null,而不是像我们期望的那样抛出错误。深入研究代码,我们从RuntimeEnumLeafInfoImpl.java中找到以下内容:

package com.sun.xml.bind.v2.model.impl;
//...
public T parse(CharSequence lexical) throws AccessorException, SAXException {
    // TODO: error handling

    B b = baseXducer.parse(lexical);
    if(b==null) {

        return null;
    }

    return parseMap.get(b);
}

很明显,parseMap是我们的枚举列表,但是如果地图的键(在这种情况下是b的值)不在地图中,它只返回null。如果b不在parseMap中,我们希望它抛出某种异常。

如果没有解决这个问题并重新编译我们自己的JAXB还有其他方法可以解决这个问题吗?


编辑:澄清

我们正在使用JAXB 2.1.9,我们想要解组数据并对其进行验证。我当然可能忽略了有关验证的文档中的内容。

1 个答案:

答案 0 :(得分:2)

您说您正在使用JAXB来验证数据,但您只是在解组XML文档后描述了意外的结果。在JAXB中,验证和解组是两个不同的,也许是独立的问题,因为您可以在至少三种不同的模式中使用JAXB:

  • 不验证
  • 验证,报告错误,但继续解组
  • 验证并打破错误

您确定已在unmarshaller上启用架构验证,并且您正在评估潜在错误吗?如何做到这一点是完全不同的,取决于你是否使用JAXB 1.0或2.0,但文档应该告诉你如何。