Java 从Calendar到Joda DateTime的JAXB适配器

Java 从Calendar到Joda DateTime的JAXB适配器,java,web-services,calendar,cxf,jodatime,Java,Web Services,Calendar,Cxf,Jodatime,我正在尝试编写一个JAXB XMLAdapter,以便xs:dateTime字段不会创建为XMLGregorianCalendar,而是创建为jodadateTime 但它并没有像预期的那样工作,尤其是自动生成的适配器在类型之间连接完全错误(wsdl2java)。但是为什么呢 <jaxb:globalBindings> <jaxb:javaType name="org.joda.time.DateTime" xmlType="xsd:dateTime"

我正在尝试编写一个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);
    }
}

公共类DateTimeAdapter扩展了XmlAdapter{
@凌驾
公共日历解组(DateTime日期)引发异常{
返回日期。toGregorianCalendar();
}
@凌驾
公共日期时间封送处理程序(日历日期)引发异常{
返回新的日期时间(日期);
}
}
结果(自动生成):

公共类适配器1
扩展XmlAdapter
{
公共日期解组(字符串值){
返回值(javax.xml.bind.DatatypeConverter.parseDateTime(值));
}
公共字符串封送处理(日期值){
如果(值==null){
返回null;
}
返回值(javax.xml.bind.DatatypeConverter.printDateTime(值));
}
}

为什么结果是带有
字符串、日期的适配器,而不是定义了我的类型?

以下是解决方案,也供我个人参考:

  • 您应该使用
    xjc:javaType
    直接定义
    XMLAdapter
    。否则,cxf将自动生成更多适配器,这些适配器必须映射到您自己的静态方法

    <jaxb:globalBindings>
        <xjc:javaType name="org.joda.time.DateTime"
            xmlType="xs:dateTime"
            adapter="path.to.MyTimeAdapter" />
    </jaxb:globalBindings>
    
    }


  • 您可以从中使用XMLDateTimeAdapter/XMLLocalDateAdapter,而不是重新发明轮子

    <jaxb:globalBindings>
        <xjc:javaType name="org.joda.time.DateTime"
            xmlType="xs:dateTime"
            adapter="path.to.MyTimeAdapter" />
    </jaxb:globalBindings>
    
    @Override
    public String marshal(DateTime date) throws Exception {
        return date.toGregorianCalendar().toString();
    }