java - 从日历到 Joda DateTime 的 JAXB 适配器

标签 java web-services calendar cxf jodatime

我正在尝试编写一个 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 的适配器而不是我定义的类型?

最佳答案

这是解决方案,也供我个人引用:

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

    <jaxb:globalBindings>
        <xjc:javaType name="org.joda.time.DateTime"
            xmlType="xs:dateTime"
            adapter="path.to.MyTimeAdapter" />
    </jaxb:globalBindings>
    
  2. 您必须从 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/

相关文章:

java - Oreo 中我自己的 URI 上的 ContentProvider.notifyChange 的安全异常

java - 使用 getSimpleName() 与 getName() 获取记录器

java - 如何使用 jax rs 调用rest

c# - ashx 请求中的 Session.SessionId 持久化

java - 是否可以重写 android CalendarView 方法?

java xml 验证 : getting a better validation error description

java - Transfer scroll event from sliding view to ScrollView - Sliding panel with ScrollView 像谷歌地图

c# - Web 服务中的数组 - 对象引用未设置为对象的实例

java - 如何计算一个月中有多少个工作日?

javascript - 如果开始日期与结束日期相同,则为完整日历