使用eclipselink对JPA对象执行jaxb marshall期间发生日期对话错误

使用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

我在这个约会对话错误上坚持了很长一段时间。。。 我正在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中,但它不起作用

提前谢谢你的帮助


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,非常感谢您对本案例的帮助。是的,上述解决方案有效!!我会密切关注错误修正。顺致敬意,嗨,布莱斯,非常感谢你帮助这个案子。是的,上述解决方案有效!!我会密切关注错误修正。顺致敬意,