Демаршаллинг с использованием JAXB

Я новичок в java (исходя из фона c # .net) и пытался выполнить приведенный выше пример для маршалинга и демаршалирования.

Перейдя по ссылке ниже Маршаллинг списка объектов, реализующих общий интерфейс, с JaxB

используя вышеупомянутую технику, упомянутую г-ном Блейзом Доганом, я смог маршалировать объекты Java в xml. Но когда я сохраняю этот xml и пытаюсь разобрать xml обратно в объект java, я получаю на консоли следующее:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 количества IllegalAnnotationExceptions @javax.xml.bind.annotation.XmlElementRef аннотация найдена в двух местах; одного было бы достаточно. эта проблема связана со следующим расположением: в @javax.xml.bind.annotation.XmlElementRef(name=##default, required=true, type=class javax.xml.bind.annotation.XmlElementRef$DEFAULT, namespace=) в public java.util.List Community.getPeople() в Community эта проблема связана со следующим местоположением: @javax.xml.bind.annotation.XmlElementRef(name=##default, required=true, type=class javax.xml .bind.annotation.XmlElementRef$DEFAULT, namespace=) в public void Community.setPeople(java.util.List) в Community....

Примечание. Я создал геттеры/сеттеры для Class Boy и Class Girl для реализации десортировки.


person jatin mistry    schedule 25.11.2011    source источник
comment
Взгляните на официальные примеры: docs.oracle.com/javaee/ 5/tutorial/doc/bnbah.html   -  person Kai    schedule 25.11.2011


Ответы (2)


Похоже, вы, возможно, аннотировали методы getPeople и setPeople. JAXB (и другие технологии Java EE) требуют, чтобы вы аннотировали только один.

public class Community {

    private List<Person> people;

    @XmlElementRef
    public List<Person> getPeople() {
        return people;
    }

    public void setPeople(List<Person> people) {
        this.people = people;
    } 

}

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

person bdoughan    schedule 25.11.2011
comment
Привет, мистер Блейз Доган. Код выглядит следующим образом: он почти такой же, как и в справочной ссылке: stackoverflow.com/questions/4144296/, но теперь я занимаюсь десортировкой... ‹code› JAXBContext jaxbContext = JAXBContext.newInstance (Сообщество.класс); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Сообщество a = (Сообщество) unmarshaller.unmarshal (новый файл (путь к файлу XML)); ‹/code› и да, я аннотировал методы getPeople и setPeople. - person jatin mistry; 25.11.2011
comment
Привет сэр, Вы были на месте...!! Все работало гладко после того, как я сохранил аннотацию только для геттера, а не для сеттера для кода распаковки класса Person: - ‹code› JAXBContext jaxbContext = JAXBContext.newInstance(Community.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Сообщество a = (Сообщество) unmarshaller.unmarshal (новый файл (XMLFilePath)); List‹Person› lstPeople = a.getPeople(); Iterator‹Person› objIterator = lstPeople.iterator(); while(objIterator.hasNext()) { Person objPerson = objIterator.next(); System.out.println(objPerson.getName()); } ‹/код› - person jatin mistry; 25.11.2011
comment
возвращаясь к тому, что пошло не так ... вывод консоли дал понять, что было не так ... но, поскольку я новичок в java, не смог понять подсказку компилятора ... Спасибо за помощь, сэр @Blaise Doughan. Пометка вашего комментария как ответа...! -джатин - person jatin mistry; 25.11.2011

Легче помочь, если бы ты показал свой код...

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

Попробуйте использовать тип доступа FIELD:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Blubb", namespace=ServiceConstants.XML_NAMESPACE)
public class Blubb implements Serializable {

    @XmlElement(name="Bla", namespace=ServiceConstants.XML_NAMESPACE)
    private Bla bla;

    public Blubb () {

    }

    public void setBla(Bla bla) { this.bla = bla; }

    public Bla getBla() { return this.bla; }
}
person hage    schedule 25.11.2011
comment
Здравствуйте, @hage. Код выглядит следующим образом: он почти такой же, как я видел в справочной ссылке: stackoverflow.com/questions/4144296/… но теперь я делаю десортировку... ‹code› JAXBContext jaxbContext = JAXBContext.newInstance(Community .класс); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Сообщество a = (Сообщество) unmarshaller.unmarshal (новый файл (путь к файлу XML)); ‹/code› и да, я прокомментировал оба метода getPeople и setPeople - person jatin mistry; 25.11.2011