我正在尝试编写一个 JAXB XMLAdapter,以便 xs:dateTime 字段不会创建为 XMLGregorianCalendar
,而是创建为 joda DateTime
。
但它没有按预期工作,尤其是自动生成的用于在类型之间连接的适配器是自动生成的,不知何故完全错误(wsdl2java)。但为什么呢?
<jaxb:globalBindings>
<jaxb:javaType name="org.joda.time.DateTime" xmlType="xsd:dateTime"
parseMethod="my.DateTimeAdapter.unmarshal"
printMethod="my.DateTimeAdapter.marshal" />
</jaxb:globalBindings>
public class DateTimeAdapter extends XmlAdapter<DateTime, Calendar>{
@Override
public Calendar unmarshal(DateTime date) throws Exception {
return date.toGregorianCalendar();
}
@Override
public DateTime marshal(Calendar date) throws Exception {
return new DateTime(date);
}
}
结果(自动生成):
public class Adapter1
extends XmlAdapter<String, Date>
{
public Date unmarshal(String value) {
return (javax.xml.bind.DatatypeConverter.parseDateTime(value));
}
public String marshal(Date value) {
if (value == null) {
return null;
}
return (javax.xml.bind.DatatypeConverter.printDateTime(value));
}
}
为什么结果是带有 String, Date
的适配器而不是我定义的类型?
最佳答案
这是解决方案,也供我个人引用:
您应该使用
xjc:javaType
直接定义XMLAdapter
。否则,cxf 将自动生成必须映射到您自己的静态方法的更多适配器。<jaxb:globalBindings> <xjc:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime" adapter="path.to.MyTimeAdapter" /> </jaxb:globalBindings>
您必须从
String
编码到所需的类,而不是从XmlGregorianCalendar
:公共(public)类 MyTimeAdapter 扩展 XmlAdapter { @覆盖 公共(public) DateTime unmarshal(String date) 抛出异常 { 返回新的日期时间(日期); }
@Override public String marshal(DateTime date) throws Exception { return date.toGregorianCalendar().toString(); }
}
关于java - 从日历到 Joda DateTime 的 JAXB 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21239879/