JAXB为映射到Date类型的元素返回null

时间:2016-06-07 21:29:07

标签: java xml datetime jaxb

我对jaxb unmarshalling有一点问题。

我有一段xml:

render_to_string

一个项目在java代码中表示为Item类:

<item>
    <title>My title</title>
    <link>https://some-link/</link>
    <comments>Hello world</comments>
    <pubDate>Thu, 13 Jan 2016 09:45:06 +0000</pubDate>
</item>

所以,当我试图解组这个xml时,我得到@XmlType public class Item{ private String title; //link and comments I'm temporary skipping @XmlElement(name = "pubDate") private Date publicDate; //getters and setters } 等于null。 我做错了什么?请指教。

2 个答案:

答案 0 :(得分:0)

您需要让JAXB知道您直接在私有字段上进行注释:

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Item{

    private String title;

    //link and comments I'm temporary skipping

    @XmlElement(name = "pubDate")
    private Date publicDate;

    //getters and setters
}

或者,您可以完全省略@XmlAccessorType注释,并为publicDate注释getter。 @XmlAccessorType的默认行为是绑定每个公共字段和/或公共getter / setter。

答案 1 :(得分:0)

如果日期格式与xsd类型dateTime匹配,则JAXB只允许您自动解组到java.util.Date实例:yyyy-MM-ddTHH:mm:ss;但是样本xml中的格式是不同的,在这种情况下,您需要实现自己的帮助程序,实现XmlAdapter<String,Date>,如下所示:

public class MyDateFormatAdapter extends XmlAdapter<String, Date> {

    private static final String FORMAT = "EEE, dd MMM yyyy HH:mm:ss Z";

    public Date unmarshal(String v) throws Exception {
        DateFormat dateFormat = new SimpleDateFormat(FORMAT);
        return dateFormat.parse(v);
    }

}

在这里演示:http://ideone.com/0dngV3