使用eclipselink在JPA对象上jaxb marshall期间的日期对话错误

时间:2012-06-21 19:50:23

标签: jpa jaxb eclipselink

我坚持这个约会对话错误很长一段时间了...... 我在TomcatEE环境下使用eclipselinks,openJPA,并尝试使用jaxb进行编组。我遇到了一个问题,一个JPA对象,包含Date,TimeStamp元素。 异常消息是---

javax.xml.bind.MarshalException   - 链接异常: [Exception [EclipseLink-3002](Eclipse Persistence Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.ConversionException 异常描述:来自[org.eclipse.persistence.oxm.mappings]的类[类org.apache.openjpa.util.java $ util $ Date $ proxy]的对象[3/19/12 12:00 AM]带有描述符[XMLDescriptor(xxx.xxxx.xxx.xxxx.entities.ApplicationEntity - > [])]的.XMLDirectMapping [createTs - > createTs / text()]]无法转换为[class java.util .Date]。]

奇怪的是jaxb转换工作对一些客户来说是好的,但不是其他客户。我试图为这个字段crtTs放置@XmlElement(type = Date.class),它不起作用。

提前感谢您的帮助。

LL

1 个答案:

答案 0 :(得分:1)

我能够重现您所看到的问题。您可以使用以下错误来跟踪我们在此问题上的进展:


周围工作

<强> DateAdapter

您可以使用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;
    }

}

<强>数值指明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>