5

私はこのような単純なxml文字列を持っています

<table>
   <test_id>t59</test_id>
   <dateprix>2013-06-06 21:51:42.252</dateprix>   
   <nomtest>NOMTEST</nomtest>
   <prixtest>12.70</prixtest>
   <webposted>N</webposted>
   <posteddate>2013-06-06 21:51:42.252</posteddate>
</table>

このようなxml文字列のpojoクラスがあります

@XmlRootElement(name="test")
public class Test {
    @XmlElement
    public String test_id;
    @XmlElement
    public Date dateprix;
    @XmlElement
    public String nomtest;
    @XmlElement
    public double prixtest;
    @XmlElement
    public char webposted;
    @XmlElement
    public Date posteddate;
}

Javaオブジェクトへのxmlバインディングにjaxbを使用しています。コードは

try {
    Test t = new Test
    JAXBContext jaxbContext = JAXBContext.newInstance(t.getClass());
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    t = (Test) jaxbUnmarshaller.unmarshal(new InputSource(new StringReader(xml))); // xml variable contain the xml string define above
} catch (JAXBException e) {
    e.printStackTrace();
}

今私の問題は、Java オブジェクトとバインドした後、日付変数 (dateprix と posteddata) に対して null を取得したので、どうすればこの値を取得できるかということです。

「2013-06-06」を使用するとデータオブジェクトを取得しましたが、「2013-06-06 21:51:42.252」の場合はnullになりました。

4

1 に答える 1

6

JAXB は、xsd:date (yyyy-MM-dd) または xsd:dateTime 形式 (yyyy-MM-ddTHH:mm:ss.sss) の XML の日付を予期します。2013-06-06 21:51:42.252 は有効な dateTime 形式ではありません 'T' (日付/時刻区切り記号) がありません。JAXB で Java Date に変換するには、カスタム XmlAdapter が必要です。例えば

class DateAdapter extends XmlAdapter<String, Date> {
    DateFormat f = new SimpleDateFormat("yyy-MM-dd HH:mm:ss.SSS");

    @Override
    public Date unmarshal(String v) throws Exception {
        return f.parse(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        return f.format(v);
    }
}

class Type {
    @XmlJavaTypeAdapter(DateAdapter.class)
    public Date dateprix;
...
于 2013-06-11T17:12:15.827 に答える