JAXB parseMethod会抛出异常,但生成的适配器方法则不会

时间:2012-01-30 16:18:43

标签: java jaxb

我有一些日期,我必须以不同于JAXB默认使用的格式在XML文件中表示。

所以,我写了一些静态方法来打印和解析所需的格式:

public static String toDateTime(XMLGregorianCalendar d) {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        .format(d.toGregorianCalendar().getTime());
}

public static XMLGregorianCalendar parseDateTime(String s)
        throws DatatypeConfigurationException, ParseException {

    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                .parse(s));
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
}

我写了一个.xjb文件,指定使用这些解析和打印方法:

<jxb:bindings
    node="//xs:element[@name='date']">
  <jxb:javaType name="javax.xml.datatype.XMLGregorianCalendar"
                parseMethod="MyClass.parseDateTime"
                printMethod="MyClass.toDateTime"
                />
</jxb:bindings>

(XML模式将元素指定为xsd:dateTime)。

xjc工具正在生成一个调用我的方法的适配器:

public XMLGregorianCalendar unmarshal(String value) {
    return (MyClass.parseDateTime(value));
}

public String marshal(XMLGregorianCalendar value) {
    return (MyClass.toDateTime(value));
}

我的问题是生成的适配器无法编译。声明unmarshal方法不会抛出异常,但MyClass.parseDateTime会抛出异常。它应该是完全合理的,因为日期可能无效。事实上,生成的适配器覆盖的unmarshal java.xml.bind.annotation.adapters.XmlAdapter方法声明它throws Exception

我找不到任何方法在xjb文件中声明parseMethod抛出的异常。在我看来,也许我应该创建自己的适配器类,但我找不到任何方法在xjb中声明应该使用我的自定义适配器。我非常希望能够使用xjc从xsd和xjb生成类,而不必在之后修改它们。

解决这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您应该在代码中处理两个已检查的异常。对于无效的日期时间,您必须决定是否将其保留为空(并可能发出警告),或者炸毁并终止整个解析尝试(在这种情况下,抛出RuntimeException包装原始{ {1}})。

ParseException的情况下,这是设计糟糕的JDK API之一,当您的代码无法执行任何操作时,会抛出已检查的异常。只需将其重新抛出为DatatypeConfigurationException