Целое число, чтобы int, используя jaxb - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть странная ситуация, когда метод получения в классе возвращает примитивный тип 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 ()", но нет установщика.Для демаршаллинга, пожалуйста, определите сеттеры.

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

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

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

2 голосов
/ 01 декабря 2011

Вы можете решить эту проблему, настроив 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);
    }

}

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

0 голосов
/ 05 декабря 2011

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

@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>, но это очень неприятно .

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