【问题标题】:JaxB gMonth validation errorJaxB gMonth 验证错误
【发布时间】:2012-12-14 03:04:55
【问题描述】:

我有用于存储一个月的 XMLGregorianCalander

@XmlElement(name = "Month")
@XmlSchemaType(name = "gMonth")
protected XMLGregorianCalendar month;

解组时出现以下错误

XML validation error on response: cvc-datatype-valid.1.2.1: '--11--' is not a valid value for 'gMonth'.

据我所知,预期格式为'--11',我发现了相关问题https://issues.apache.org/jira/browse/XERCESJ-1342,但我不知道更改gMonth格式的解决方案

xsd 中的 gmonth 如下所示:

<xs:element name="Month" type="xs:gMonth"/>

是否已解决此问题或存在解决方法?

【问题讨论】:

    标签: java xml datetime formatting jaxb


    【解决方案1】:

    您可以使用XmlAdapter 来处理此用例。

    GMonthAdapter

    package forum13872065;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import javax.xml.datatype.*;
    
    public class GMonthAdapter extends XmlAdapter<String, XMLGregorianCalendar> {
    
        DatatypeFactory dtf;
    
        public GMonthAdapter() {
             try {
                dtf = DatatypeFactory.newInstance();
            } catch (DatatypeConfigurationException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public XMLGregorianCalendar unmarshal(String v) throws Exception {
            return dtf.newXMLGregorianCalendar(v);
        }
    
        @Override
        public String marshal(XMLGregorianCalendar v) throws Exception {
            String string = v.toXMLFormat();
            if(string.endsWith("--")) {
                return string.substring(0,4);
            }
            return string;
        }
    
    }
    

    @XmlJavaTypeAdapter 注解用于引用XmlAdapter

    package forum13872065;
    
    import javax.xml.bind.annotation.*;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Root {
    
        @XmlElement(name = "Month")
        @XmlSchemaType(name = "gMonth")
        @XmlJavaTypeAdapter(GMonthAdapter.class)
        protected XMLGregorianCalendar month;
    
    }
    

    演示

    下面是一些演示代码来证明一切正常。

    package forum13872065;
    
    import javax.xml.bind.*;
    import javax.xml.datatype.DatatypeFactory;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Root.class);
    
            Root root = new Root();
            DatatypeFactory dtf = DatatypeFactory.newInstance();
            root.month = dtf.newXMLGregorianCalendar("--11");
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(root, System.out);
        }
    
    }
    

    输出

    下面是运行演示代码的输出。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <root>
        <Month>--11</Month>
    </root>
    

    【讨论】:

    • 尽管如此,jaxb 为什么要这样做?格式不正确?
    【解决方案2】:

    gMonth 的正确格式确实是--mm,但在XSD 1.0 规范的原始版本中有一个错误,将其指定为--mm--。不幸的是,这个错误在很多关于 XSD 的书籍和教程中以及在一些软件产品中都重复出现,然后才被纠正。所以今天使用这种数据类型仍然很麻烦,尽管这个 bug 大约在十年前就被正式修复了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多