JAXB выдает ошибку конструктора с нулевым аргументом для поля @XmlTransient - PullRequest
3 голосов
/ 08 марта 2012

У меня есть класс, который объявляет поле Joda Time DateTime.

Однако значение этого параметра не устанавливается процессом unmarhsalling, а устанавливается позже в методе afterUnmarhsal.

Поэтому поле помечено XmlTransient:

@XmlTransient
private DateTime startTime;

Однако при попытке запуска я сталкиваюсь с этой ошибкой:

javax.xml.bind.JAXBException: Exception Description: для класса org.joda.time.DateTime $ Property требуется конструктор с нулевым аргументом или указанный фабричный метод.Обратите внимание, что нестатические внутренние классы не имеют конструкторов с нулевым аргументом и не поддерживаются.- со связанным исключением: [Exception [EclipseLink-50001] (Eclipse Persistence Services - 2.2.0.v20110202-r8913) ...

Почему JAXB должен заботиться об этом классе, учитывая, что он явно временныйв целях маршаллинга и демаршаллинга?

Как я могу сказать JAXB игнорировать это поле?Я знаю, что я мог бы использовать метод фабрики, но это кажется бессмысленным, учитывая, что фабрика не сможет создать экземпляр значения (именно поэтому это сделано в afterUnmarshal)

1 Ответ

1 голос
/ 08 марта 2012

В EclipseLink 2.2.0, похоже, есть ошибка, которая была исправлена ​​в более поздних выпусках EclipseLink.Вы по-прежнему будете видеть это исключение в последнем выпуске EclipseLink, если вы используете доступ по умолчанию (XmlAccessType.PUBLIC), но аннотируете поле:

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 - аннотируйте свойство

Вместо поля аннотации вы можете аннотировать свойство (метод get) с помощью @XmlTransient:

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;
    }

}

Для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...