使用eclipselink对JPA对象执行jaxb marshall期间发生日期对话错误
我在这个约会对话错误上坚持了很长一段时间。。。 我正在Tomcate环境下使用EclipseLink和openJPA,并尝试使用jaxb进行编组。我遇到了marshall one JPA对象的一个问题,该对象包含日期、时间戳元素。 异常消息是-- javax.xml.bind.MarshalException -除此之外: [异常[EclipseLink-3002](Eclipse持久性服务-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.ConversionException 异常描述:无法将映射[org.eclipse.persistence.oxm.mappings.XMLDirectMapping[createTs-->createTs/text()]中的类[class org.apache.openjpa.util.java$util$Date$proxy]的对象[3/19/12:00 AM]和描述符[xmlsdescriptor(xxx.xxx.xxx.xxxx.entications.ApplicationEntity-->[])转换为[class java.util.Date].] 奇怪的是,jaxb转换对某些客户来说是正常的,但对其他客户来说则不然。我试图将@XmlElement(type=Date.class)放在这个字段crtTs中,但它不起作用 提前谢谢你的帮助使用eclipselink对JPA对象执行jaxb marshall期间发生日期对话错误,jpa,jaxb,eclipselink,Jpa,Jaxb,Eclipselink,我在这个约会对话错误上坚持了很长一段时间。。。 我正在Tomcate环境下使用EclipseLink和openJPA,并尝试使用jaxb进行编组。我遇到了marshall one JPA对象的一个问题,该对象包含日期、时间戳元素。 异常消息是-- javax.xml.bind.MarshalException -除此之外: [异常[EclipseLink-3002](Eclipse持久性服务-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exce
LL我已经能够重现您看到的问题。您可以使用以下错误跟踪我们在此问题上的进展:
解决问题 日期适配器 您可以使用
XmlAdapter
将有问题的日期转换为正确的java.util.date
package forum11145711;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<Date, Date>{
@Override
public Date unmarshal(Date date) throws Exception {
return date;
}
@Override
public Date marshal(Date date) throws Exception {
if(null == date) {
return date;
}
return new Date(date.getTime());
}
}
MyDate
下面是我在本例中使用的java.util.Date
的子类
package forum11145711;
import java.util.Date;
public class MyDate extends Date {
}
演示
下面是一些演示代码,可以用来证明一切正常:
package forum11145711;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.setDate(new MyDate());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
输出
<?xml version="1.0" encoding="UTF-8"?>
<root>
<date>2012-06-27T10:39:49.081</date>
</root>
2012-06-27T10:39:49.081
我已经能够重现您看到的问题。您可以使用以下错误跟踪我们在此问题上的进展:
解决问题 日期适配器 您可以使用
XmlAdapter
将有问题的日期转换为正确的java.util.date
package forum11145711;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<Date, Date>{
@Override
public Date unmarshal(Date date) throws Exception {
return date;
}
@Override
public Date marshal(Date date) throws Exception {
if(null == date) {
return date;
}
return new Date(date.getTime());
}
}
MyDate
下面是我在本例中使用的java.util.Date
的子类
package forum11145711;
import java.util.Date;
public class MyDate extends Date {
}
演示
下面是一些演示代码,可以用来证明一切正常:
package forum11145711;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.setDate(new MyDate());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
输出
<?xml version="1.0" encoding="UTF-8"?>
<root>
<date>2012-06-27T10:39:49.081</date>
</root>
2012-06-27T10:39:49.081
OpenJPA似乎返回了自己的Date子类,这是EclipseLink JAXB(MOXy)所不期望的。你能更新你的问题以包含完整的stacktrace吗?Blaise,是你!非常感谢。非常感谢。我已经能够重现您看到的问题,并输入了一个bug()。我还添加了一个答案,为您提供了一个可以使用的解决方案。OpenJPA似乎返回了自己的Date子类,EclipseLink JAXB(MOXy)不希望返回这个子类。你能更新你的问题以包含完整的stacktrace吗?Blaise,是你!非常感谢。非常感谢。我已经能够重现您看到的问题,并输入了一个bug()。我还添加了一个答案,提供了一个您可以使用的解决方法。嗨,Blaise,非常感谢您对本案例的帮助。是的,上述解决方案有效!!我会密切关注错误修正。顺致敬意,嗨,布莱斯,非常感谢你帮助这个案子。是的,上述解决方案有效!!我会密切关注错误修正。顺致敬意,