将LocalDateTime与JAXB一起使用

时间:2015-01-28 10:09:31

标签: java time jaxb

我正在尝试将JAXB用于LocalDateTime类型的字段。我写了一个适配器来处理转换:

public class LocalDateTimeXmlAdapter extends XmlAdapter<String, LocalDateTime> {
    @Override
    public String marshal(LocalDateTime arg0) throws Exception {
        return arg0.toString();
    }

    @Override
    public LocalDateTime unmarshal(String arg) throws Exception {
        return LocalDateTime.parse(arg);
    }
}

我在package-info.java中注册了适配器,如下所示:

@XmlJavaTypeAdapters({
        @XmlJavaTypeAdapter(type=LocalDateTime.class, value=LocalDateTimeXmlAdapter.class)
})
package xml;

import java.time.LocalDateTime;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;

根据this page,这似乎已经足够了。 但是,我一直收到以下错误:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.time.LocalDateTime does not have a no-arg default constructor.

我理解抛出异常的原因,但我几乎无法向java.time.LocalDateTime添加默认构造函数。这似乎是班级/一个奇怪的设计决定的缺点。有没有解决方法?

2 个答案:

答案 0 :(得分:2)

你有什么应该工作。以下之一可能是错误的:

  1. 由于您已在程序包级别指定了@XmlJavaTypeAdapter,因此它仅适用于名为xml的程序包中的类的属性。模型中是否有来自不同包的类具有LocalDateTime类型的映射属性?
  2. 您的package-info.java文件也可能未编译。

答案 1 :(得分:1)

有同样的行为:IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions

我的pbm是:我有几个包(三个)需要package-info.java文件,如following picture所示。

我&#34;解决了#34;这个pbm通过在三个目录中的每一个中添加package-info.java。包fr.gouv.agriculture.dal.ct.planCharge.metier.dao.charge.xml的示例:

@XmlJavaTypeAdapter(type = LocalDate.class, value = LocalDateXmlAdapter.class)
package fr.gouv.agriculture.dal.ct.planCharge.metier.dao.charge.xml;

如果有人比复制/粘贴到多个package-info.java文件有更好的主意,请提前感谢。