Java HTML / XML How to - Handle JaxB gMonth validation error








Question

We would like to know how to handle JaxB gMonth validation error.

Answer

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
//from   ww  w  .j a v a2s. c  om
public class Main {

  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);
  }

  @XmlRootElement
  @XmlAccessorType(XmlAccessType.FIELD)
  public static class Root {

    @XmlElement(name = "Month")
    @XmlSchemaType(name = "gMonth")
    @XmlJavaTypeAdapter(GMonthAdapter.class)
    protected XMLGregorianCalendar month;

  }

  public static 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;
    }

  }

}