Java 从Calendar到Joda DateTime的JAXB适配器
我正在尝试编写一个JAXB XMLAdapter,以便xs:dateTime字段不会创建为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"
XMLGregorianCalendar
,而是创建为jodadateTime
但它并没有像预期的那样工作,尤其是自动生成的适配器在类型之间连接完全错误(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();
}