Целое число в int с использованием jaxb

У меня странная ситуация, когда геттер в классе возвращает примитивный тип int, а сеттер принимает класс Integer.

Когда jaxb демаршалирует элемент в этот класс, он не может найти искомый сеттер:

public class Foo {
    int bar;

    public int getBar() {
        return this.bar;
    }

    public void setBar(Integer bar) {
        this.bar = bar.intValue();
    }
}

Я попытался добавить:

@XmlElement ( type = java.lang.Integer.class, name = "bar" ) 

геттеру (и сеттеру), чтобы изменить тип поля в схеме, но это не помогает.

Во время десортировки я получаю эту ошибку: у свойства есть геттер "public int com.example.getBar()", но нет сеттера. Для десортировки, пожалуйста, определите сеттеры.

Я не могу изменить класс, например, я не могу изменить bar на Integer или добавить новый сеттер с примитивным типом, но я могу добавить аннотации.


person rouble    schedule 30.11.2011    source источник


Ответы (3)


Вы можете решить эту проблему, настроив JAXB для использования доступа к полю. Это делается с помощью аннотации @XmlAccessorType:

package forum8334195;

import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
    int bar;

    public int getBar() {
        return this.bar;
    }

    public void setBar(Integer bar) {
        this.bar = bar.intValue();
    }

    /**
     * Put logic to update domain object based on bar field here.  This method
     * will be called after the Foo object has been built from XML.
     */
    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
         System.out.println(bar);
    }

}

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

person bdoughan    schedule 01.12.2011
comment
хороший момент, хотя это пропустит setBar() все вместе. У нас есть некоторая бизнес-логика в сеттере, которую нужно выполнить. - person rouble; 01.12.2011
comment
@prmatta - Можно ли сделать эту бизнес-логику в событии XmlAdapter или afterUnmarshal. - person bdoughan; 01.12.2011
comment
возможно - как здесь поможет XMLAdapter? - person rouble; 01.12.2011
comment
@prmatta - Это зависит от того, что вы хотите сделать. Ваш установщик действует только на устанавливаемое значение или как-то влияет на состояние объекта домена? - person bdoughan; 01.12.2011
comment
это влияет на состояние объекта. - person rouble; 02.12.2011
comment
@prmatta - я обновил свой ответ событием afterUnmarshal, которое вы можете использовать для обновления вашего объекта Foo на основе значения поля bar. - person bdoughan; 02.12.2011

Пишу с телефона, так что терпите меня! Свойство не соответствует спецификации javabeans, так что проблема в этом, как вы, вероятно, знаете. Можете ли вы добавить новую пару сеттер/геттер, используя новое имя, оба из которых используют Integer, и поместить теги XML в это новое свойство? Новые методы будут просто делегировать полномочия существующим. ХТН

person davidfrancis    schedule 30.11.2011

Очень жаль, что вы не можете ввести какие-либо дополнительные методы. Если бы вы могли добавить дополнительный метод private, вы могли бы сделать это:

@XmlAccessorType(XmlAccessType.NONE)
public class Foo {
    int bar;

    public int getBar() {
        return this.bar;
    }

    @XmlElement
    private Integer getBar() {
        return this.bar;
    }

    public void setBar(Integer bar) {
        this.bar = bar.intValue();
    }
}

Если это не сработает, возможно, вы застряли с использованием @XmlJavaTypeAdaptor и XmlAdaptor<Foo, YourAdaptedFoo>, но это действительно противно.

person Donal Fellows    schedule 04.12.2011