JAXB为@XmlTransient字段抛出零参数构造函数错误

时间:2012-03-07 22:34:03

标签: java jaxb eclipselink

我有一个声明Joda Time DateTime字段的类。

但是,这个值不是由unmarhsalling过程设置的,而是稍后在afterUnmarhsal方法中设置的。

因此,该字段标记为XmlTransient

@XmlTransient
private DateTime startTime;

但是,在尝试启动时,我遇到了这个错误:

  

javax.xml.bind.JAXBException:异常说明:该类   org.joda.time.DateTime $ Property需要零参数构造函数   或指定的工厂方法。请注意,非静态内部类可以   没有零参数构造函数,不受支持。     - 链接异常:[Exception [EclipseLink-50001](Eclipse Persistence Services - 2.2.0.v20110202-r8913)...

为什么JAXB应该关心这个类,因为它对于marhsalling& amp;解组目的?

如何告诉JAXB忽略此字段?我知道我可以在那里放置一个工厂方法,但似乎毫无意义,因为工厂将无法实例化该值(这就是为什么它在afterUnmarshal中完成)

1 个答案:

答案 0 :(得分:1)

EclipseLink 2.2.0中似乎存在一个错误,该错误已在以后的EclipseLink版本中修复。如果您使用默认访问权限(XmlAccessType.PUBLIC),您仍会在最新的EclipseLink版本中看到此异常,但是注释该字段:

package forum9610190;

import javax.xml.bind.annotation.XmlTransient;
import org.joda.time.DateTime;

public class Root {

    @XmlTransient
    private DateTime startTime;

    public DateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(DateTime startTime) {
        this.startTime = startTime;
    }

}

选项#1 - 注释属性

您可以使用@XmlTransient注释属性(get方法)而不是注释字段:

package forum9610190;

import javax.xml.bind.annotation.XmlTransient;
import org.joda.time.DateTime;

public class Root {

    private DateTime startTime;

    @XmlTransient
    public DateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(DateTime startTime) {
        this.startTime = startTime;
    }

}

选项#2 - 注释字段并使用@XmlAccessorType(XmlAccessType.FIELD)

如果您想要注释该字段,则需要在班级上指定@XmlAccessorType(XmlAccessType.FIELD)

package forum9610190;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlTransient;
import org.joda.time.DateTime;

@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlTransient
    private DateTime startTime;

    public DateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(DateTime startTime) {
        this.startTime = startTime;
    }

}

了解更多信息