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

标签 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 中我将得到 ClassCastException。

所以,长话短说:我怎样才能在 XSD 中保留我的 Enum 类型并且仍然能够访问它的传入原始字符串值?

布莱斯? :)

最佳答案

由于没有发布任何答案,这里是我所做的(肮脏的技巧,但有效...): 放弃适配器,显然他们无法处理。

我已经介绍了我自己的类(class) com.sun.xml.bind.v2.model.impl.RuntimeEnumLeafInfoImpl

阴影原来的那个。类体是一样的,只是在 parse(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;
}

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

关于java - JAXB:将 XML 枚举验证为字符串,同时在 XSD 中保留类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29533674/

相关文章:

JavaFX NumberAxis AutoRange 无限循环

java - 具有 spark 序列化问题的功能接口(interface)

java - 哪个更适合静态数据 - final char 还是 enum?

Java:XML 到对象以及对象到带有属性的 XML

java - 解码 JAXB 时动态标记值为 null(基于 http ://stackoverflow. com/a/26328873/383861)

java 调度程序 Spring 与 Quartz

java - 从 Hijri 日期字符串中获取公历日期

c++ - 强烈枚举为整数,反之亦然

c# - 如何在 Entity Framework 中使用 Fluent API 以一对多关系映射枚举?

java - jaxb 中枚举类型的解码