Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unmarshall JAXB marshalled List failing with NullPointerExceptin

I have a list of Person objects within a ListWrapper and every Person object contains a list of telefonnummbers. Marschalling via JAXB.marschall(file, PersonList.class) is working fine. The problem is the unmarshalling. I get an NullPointerException, see stacktrace below. I suspect missing or wrong annotations but i can't figure it out by myself...

Code

public class TelefonNr {[..]}
public class Person {
  [..]
  List<TelefonNr> telefonNrs;
  [..]
  @XmlElement(name = "number")
  @XmlElementWrapper(name = "telefonnumbers")
  public List<TelefonNr> getTelefonNrs(){
    return this.telefonNrs;
  }
  [..]
}
@XmlRootElement(name = "persons")
public class PersonList {
  List<Person> persons;
  [..]
  @XmlElement(name = "person")
public List<Person> getPersons() {
    return this.Persons;
}
  [..]
}

Exceptions stacktrace

at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:289)
at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:253)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Scope.add(Scope.java:106)
at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty$ReceiverImpl.receive(ArrayERProperty.java:198)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:523)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:143)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2973)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
at org.twinhowi.organizer.core.DatastructureDemo.testUnmarshalling(DatastructureDemo.java:131)
at org.twinhowi.organizer.core.DatastructureDemo.main(DatastructureDemo.java:144)
like image 239
Merlin Bögershausen Avatar asked Oct 30 '14 18:10

Merlin Bögershausen


People also ask

Does Jaxb work with Android?

Android doesn't support JAXB. Use this library to generate SimpleXML annotated classes from XML Schema.

What is marshalling JAXB?

The JAXB Marshaller interface is responsible for governing the process of serializing Java content trees i.e. Java objects to XML data. This marshalling to XML can be done to variety of output targets.


1 Answers

Theory:

You may have to initialize the collection - either eager or lazy.

List<TelefonNr> telefonNrs = new LinkedList<TelefonNr>();

Or:

public List<Person> getPersons() {
    if (this.persons == null) {
       this.persons =  new LinkedList<Person>();
    }
    return this.persons;
}

But see also this question:

Help troubleshooting JAXB unmarshalling NPE

like image 97
lexicore Avatar answered Sep 19 '22 12:09

lexicore