JAXB:在保留XSD类型的同时将XML枚举验证为字符串

时间:2015-04-09 08:37:37

标签: java enums jaxb

我的带有注释的传输类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class PersonalData {

  @XmlElement
  private ETSalutation salutation;

}

生成的XSD很不错:

<xs:element name="salutation" type="tns:ETSalutation"/>

已知的事实是,当在传入的XML中找到未知值时,JAXB将设置为null。我需要检查它,所以我想使用XmlAdapter进行内部验证。但是当我实现适配器时:

 class ETSalutationEnumAdapter implements XmlAdapter<String, ETSalutation>

并附上它:

  @XmlElement
  @XmlJavaTypeAdapter(ETSalutationEnumAdapter.class)
  private ETSalutation salutation;

...我在XSD中输入了一个字符串类型:

<xs:element name="salutation" type="xs:string"/>

当我使用@XmlElement(type = ETSalutation.class)强制类型时,在Adapter I中将获得ClassCastException。

所以,长话短说:我如何在XSD中保留我的枚举类型并仍然能够访问它的传入原始字符串值?

布莱斯? :)

1 个答案:

答案 0 :(得分:1)

由于没有发布任何答案,这里我做了什么(肮脏的黑客,但工作......): 放弃适配器,显然他们无法处理。

我已经介绍了自己的课程 com.sun.xml.bind.v2.model.impl.RuntimeEnumLeafInfoImpl

阴影原始阴影。类体是相同的,在解析(CharSequence lexical)方法中有一个变化,现在看起来像这样:

@Override
public T parse(CharSequence lexical) throws AccessorException, SAXException {

    B b = this.baseXducer.parse(lexical);

    if (this.tokenStringType) {
        b = (B) ((String) b).trim();
    }

    T value = this.parseMap.get(b);

    // no value found, means incorrect value in incoming XML
    if (value == null) {
        // find out XML field name
        String fieldName = StringUtils.substringAfterLast(getUpstream().getLocation().toString(), ".");
        // add error data to context
        Triple error = Triple.of(getClazz(), fieldName, lexical.toString());
        // Context is my own class, which contains ThreadLocal field to gather all errors
        Context.getJaxbEnumErrors().add(error);
        LOG.debug("Enum parsing error: " + error);
    }

    return value;
}

根据我的Triple中的数据,我现在可以匹配我需要报告错误的XML位置,并且我有无效值:)但解决方案非常脏

相关问题