我有一个声明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
中完成)
答案 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;
}
}
了解更多信息