2013-02-20 2 views
2

У меня есть геттер/сеттер пара для элемента в JAXB:Как работает unmarshalling в JAXB?

@XmlElementWrapper(name="requires", required=true) 
@XmlElement(name="equals", required=true) 
List<MyObject> getMyObjects() { 
    return this.myObject; 
} 
void setMyObjects(final MyObject... myObjects) { 
    //call the regular method for setting the objects 
    //that does not have the required signature type 
} 

Дела в том, что метод сеттера никогда не вызывался. Я поставил точку останова как на геттер, так и на сеттер, а на приемник попал, но не у сеттера.

Я только что нашел this question, но я не совсем понял ответ. myObjects инициализируется во время построения, поэтому похоже, что он соответствует сценарию 2. Что происходит в процессе unmarshalling после вызова getter?

+0

Избиратель не используется, потому что нет необходимости. Вы можете просто манипулировать списком, возвращаемым установщиком. См. Ответ ниже ... – jahroy

+0

@jahroy Я откат вашего редактирования, потому что я чувствовал, что вы слишком сильно изменили вопрос. Я не хочу знать, как конкретно работают списки - я хочу знать, почему мой подход не работает. – chama

+0

Что не работает в вашем подходе? Я не предлагаю альтернативный подход, я просто пытаюсь описать, как использовать списки в объектах, которые создаются с помощью JAXB. Непонятно, о чем вы спрашиваете. Конечно, ваш метод с именем «_setMyObjects_» не вызывается. Это не сеттер для вашего списка: он принимает массив в качестве аргумента вместо списка!То, что я пытаюсь сделать, это то, что JAXB не использует сеттеры для списков. У моих сгенерированных объектов JAXB даже нет сеттеров для полей, которые являются списками. – jahroy

ответ

3

Ваш сеттер не совпадает с подписью вашего геттера. Вместо того, чтобы:

void setMyObjects(final MyObject... myObjects) 

Вам нужно

void setMyObjects(List <MyObject> myObjects) 
+0

Я пробовал это, но это не помогло. Когда я пытался пройти через unmarshalling код, я заметил, что есть переменная с именами правильного getter и setter в имени, поэтому я не думаю, что он не нашел setter. – chama

+0

Какая у вас проблема (ошибка мудрая)? – Perception

+0

Ошибка. Это просто не вызов метода setter. – chama

1

Это на самом деле не объясняет, почему JAXB работает так, как это делает, но я был в состоянии получить свой код, чтобы работать так, как я хотел. Я действительно не знаю, почему, но это то, что я сделал:

@XmlElementWrapper(name="requires", required=true) 
@XmlElement(name="equals", required=true) 
MyObject[] getMyObjects() { //myObjects is an ArrayList 
    return this.myObjects.toArray(EMPTY_OBJECT_ARRAY); 
} 
void setMyObjects(final MyObject... myObjects) { 
    //call the regular method for setting the objects 
    //that does not have the required signature type 
} 
+1

'MyObject ...' эквивалентно 'MyObject []'. –

2

Вы genearlly не использовать сеттер для списка полей в объектах JAXB.

Вместо этого вы используете getter для списка и maniuplate возвращенного списка.

Пример JAXB объекта:

class JaxbExample { 
    @XmlElement(name="stringList", required = true) 
    private List<String> stringList; 

    public List<String> getStringList() { 
     return stringList; 
    } 
} 

добавить три строки в stringList:

JaxbExample someObject = ...; 

// add three Strings to stringList 

someObject.getStringList().add("foo"); 
someObject.getStringList().add("bar"); 
someObject.getStringList().add("baz"); 

// now the list contains 3 new strings and there was 
// no need to use a setter. 

набор StringList к существующему списку:

JaxbExample someObject = ...; 
List<String> someList = ...; 

// set someObject's stringList to someList 

someObject.getStringList().addAll(someList); 

Чтобы уточнить далее ...

Мы иногда генерируем наши классы Java JAXB из файлов схемы XML (файлы .XSD), используя XJC utility.

Когда сгенерированный класс содержит элемент списка, для Списка не создается метод setter.

Следующий комментарий появится выше поглотителе для каждого списка:

/** 
* Gets the value of the stringList property. 
* 
* <p> 
* This accessor method returns a reference to the live list, 
* not a snapshot. Therefore any modification you make to the 
* returned list will be present inside the JAXB object. 
* This is why there is not a <CODE>set</CODE> method for the stringList property. 
* 
* <p> 
* For example, to add a new item, do as follows: 
* <pre> 
* getStringList().add(newItem); 
* </pre> 
* 
* 
* <p> 
* Objects of the following type(s) are allowed in the list 
* {@link String } 
* 
* 
*/ 

Надеется, что комментарий делает лучше объяснить, чем я !!

+0

Это не отвечает на мой вопрос. Мой способ сделать это намного чище, чем ваш - мне не нужно иметь 2 объекта для каждого объекта, который я хочу маршалировать и развязать. Можете ли вы объяснить, почему вы считаете, что это лучший подход? – chama

+0

@chama - Я вообще не понимаю ваш комментарий. Я не предлагаю подход, я просто разбираюсь в том, как использовать списки с объектами JAXB. Почему вы чувствуете, что предлагаю подход, который требует 2 объекта? Я думаю, что здесь есть проблема с коммуникацией. – jahroy

+0

Для каждого объекта Java MyObject, как вы его здесь представляете, вам также должен быть объект типа MyJaxb. Это 2 объекта для каждых 1 объектов, которые мне действительно нужны ... Может быть, я просто не понимаю, что buildJaxbObject() и buildFooObject() do – chama

Смежные вопросы