使用 eclipselink 在 JPA 对象上进行 jaxb 编组期间的日期对话错误
Posted
技术标签:
【中文标题】使用 eclipselink 在 JPA 对象上进行 jaxb 编组期间的日期对话错误【英文标题】:Date conversation error during jaxb marshall on a JPA object using eclipselink 【发布时间】:2012-06-21 19:50:22 【问题描述】:我在这个日期对话错误上停留了很长一段时间...... 我在 TomcatEE 环境下使用 eclipselinks、openJPA,并尝试使用 jaxb 进行编组。我遇到了编组一个 JPA 对象的问题,该对象包含 Date、TimeStamp 元素。 异常消息是---
javax.xml.bind.MarshalException - 有关联的例外: [异常 [EclipseLink-3002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ConversionException 异常描述:对象 [3/19/12 12:00 AM],属于 [class org.apache.openjpa.util.java$util$Date$proxy],来自映射 [org.eclipse.persistence.oxm.mappings .XMLDirectMapping[createTs-->createTs/text()]] 带有描述符 [XMLDescriptor(xxx.xxxx.xxx.xxxx.entities.ApplicationEntity --> [])],无法转换为 [class java.util.Date ].]
奇怪的是 jaxb 转换对某些客户来说可以正常工作,但对其他客户则不行。我试图把@XmlElement(type=Date.class) 这个字段crtTs,它不起作用。
提前感谢您的帮助。
LL
【问题讨论】:
OpenJPA 似乎返回了它自己的 Date 子类,这是 EclipseLink JAXB (MOXy) 没有预料到的。您能否更新您的问题以包含完整的堆栈跟踪? 布莱斯,是你!谢谢!谢谢!! 我已经能够重现您所看到的问题并输入了一个错误 (bugs.eclipse.org/383639)。我还添加了一个答案,该答案提供了您可以使用的解决方法。 【参考方案1】:我已经能够重现您看到的问题。您可以使用以下错误来跟踪我们在此问题上的进展:
http://bugs.eclipse.org/383639解决方法
日期适配器
您可以使用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());
根
@XmlJavaTypeAdapter
注释用于利用XmlAdapter
:
package forum11145711;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Root
private Date date;
@XmlJavaTypeAdapter(DateAdapter.class)
public Date getDate()
return date;
public void setDate(Date date)
this.date = date;
我的日期
下面是我在本例中使用的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>
【讨论】:
嗨,Blaise,非常感谢您对这个案子的帮助。是的,上述解决方法有效!我会密切关注错误修复。最好的问候!以上是关于使用 eclipselink 在 JPA 对象上进行 jaxb 编组期间的日期对话错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 JPA (Eclipselink) 在 H2 数据库中执行全文搜索
JPA + EclipseLink+ HSQLDB 不创建表