gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:36:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com