1

私はかなり長い間、この日付の会話エラーに固執しています... TomcatEE環境でeclipselinks、openJPAを使用し、マーシャリングを行うjaxbを使用しようとしています。Date、TimeStamp 要素を含む 1 つの JPA オブジェクトをマーシャリングする際に問題が発生しました。例外メッセージは ---

javax.xml.bind.MarshalException - リンクされた例外: [Exception [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 変換が正常に機能しますが、他の顧客では正常に機能しません。このフィールド crtTs に @XmlElement(type=Date.class) を入れようとしましたが、うまくいきません。

事前にご協力いただきありがとうございます。

LL

4

1 に答える 1

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;
    }

}

私の日付

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-27T14:37:25.793 に答える