我有一些日期,我必须以不同于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生成类,而不必在之后修改它们。
解决这种情况的最佳方法是什么?
答案 0 :(得分:1)
您应该在代码中处理两个已检查的异常。对于无效的日期时间,您必须决定是否将其保留为空(并可能发出警告),或者炸毁并终止整个解析尝试(在这种情况下,抛出RuntimeException
包装原始{ {1}})。
在ParseException
的情况下,这是设计糟糕的JDK API之一,当您的代码无法执行任何操作时,会抛出已检查的异常。只需将其重新抛出为DatatypeConfigurationException
。