2010-07-12 6 views
2

Я пытаюсь развязать XML-документ, созданный из аннотированного класса jersey JAXB.JAXB unmarshalling не работает для сложного объекта, содержащего коллекцию

JAXBContext jaxbCtx = JAXBContext.newInstance(MyClass.class); 
Unmarshaller m = jaxbCtx.createUnmarshaller(); 
MyClass result = (MyClass) m.unmarshal(in) 

MyClass выглядит что-то вроде:

@XmlRootElement(name = "my-class") 
@XmlSeeAlso(SomeOther.class) 
public class MyClass { 
    private Collection<SomeOther> result; 
    private URI uri; 
    private String errorMsg; 

    @XmlElement 
    public String getError() { 
     return errorMsg; 
    } 
    @XmlElement 
    public Collection<SomeOther> getResult() { 
     return // some Set<SomeOther>; 
    } 
    @XmlAttribute 
    public URI getUri() { 
     return uri; 
    } 

Образец XML, как показано ниже:

<my-class uri="some uri"> 
    <error></error> 
    <result> 
     <some other information in tags> 
    </result> 
    ... 
    <result> 
    </result> 
</my-class> 

Объект возвращаемый JAXB unmarshaler содержит все значения как нуль; Может ли кто-нибудь помочь здесь? Thanks Nayn

+0

Можете ли вы удалить это из браузера, чтобы узнать, что XML идет от вашего ресурса? Или вы уже подтвердили, что данные, поступающие в unmarshaller, хороши. – rynmrtn

+0

Да. Это хорошо. Я проверял. – Nayn

ответ

4

Это потому, что вам не хватает установленных методов. Если вы предоставляете только методы get, JAXB считает это свойство только для записи.

Если вы не хотите, чтобы добавить набор методов, то вы можете добавить следующую строку в ваш класс:

@XmlAccessorType(XmlAccessType.FIELD) 

А затем аннотирования поля вместо свойств.

+0

Не могли бы вы объяснить, что такое поля и какие здесь свойства? – Nayn

+0

Поля являются переменными экземпляра (например, uri), а свойствами являются комбинации get/set (такие как getUri()/setUri()). –

+0

Это сработало хорошо. Большое спасибо Doughan. Это очистило мое понимание о JAXB. – Nayn

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