2011-06-15 3 views
7

Je travaille avec une API sur laquelle je n'ai aucun contrôle et qui renvoie des XML. Fondamentalement, j'ai directory objet qui peut contenir plusieurs objets directory et file qui ne sont pas enveloppés par une étiquette, parmi quelques autres champs primitifs. file objet contient peu de champs primitifs et 2 listes qui sont enveloppées par tPathList et oPathList étiquettes.Aide au dépannage JAXB unmarshalling NPE

Voici un exemple de ce type XML:

<hwreply> 
    <result>1</result> 
    <directory> 
    <file> 
     <created>DATE</created> 
     <modified>DATE</modified> 
     <name>STRING</name> 
     <size>INT</size> 
     <tPath>STRING</tPath> 
     <oPath>STRING</oPath> 
     <aPath>STRING</aPath> 
     <tPathList> 
     <tPath>STRING</tPath> 
     ... 
     </tPathList> 
     <oPathList> 
     <oPath>STRING</oPath> 
     ... 
     </oPathList>  
    </file> 
    <file>...</file> 
    ... 
    <directory>...</directory> 
    <directory>...</directory> 
    ... 
    <nEntries>5</nEntries> 
    <created>DATE</created> 
    <modified>DATE</modified> 
    </directory> 
</hwreply> 

J'ai créé Directory et des objets de fichiers et OpenDirectory qui est la racine. Quand j'appelle

OpenDirectory od = response.getEntity(OpenDirectory.class);

-je obtenir l'exception suivante:

Exception in thread "main" java.lang.NullPointerException 
    at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:290) 
    at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:254) 
    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:195) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:507) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:145) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 
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:2938) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173) 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:120) 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:103) 
at com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider.readFrom(XMLRootElementProvider.java:115) 
at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111) 
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553) 
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:506) 
at liveperson.lphosting.plugins.cdn.proxy.highwinds.HighwindsProxy.getDirectory(HighwindsProxy.java:49) 
at liveperson.lphosting.plugins.cdn.proxy.highwinds.HighwindsProxy.main(HighwindsProxy.java:59) 

Je pensais que ce qui a trait à l'une des listes que j'ai, mais je ne pouvais pas comprendre où est-ce que je me trompe . Toute aide serait appréciée.

Merci d'avance.

Voici les classes (moins quelques champs/méthodes):

@XmlRootElement(name = "hwreply") 
public class OpenDirectory extends ResponseBase { 

@XmlElement(name="session") 
public Session getSession() {...} 

public void setSession(Session session) {...} 

@XmlElement(name="directory") 
public Directory getDirectory() {...} 

public void setDirectory(Directory directory) {...} 
} 



public class Directory { 

... 
private List<Directory> directories; 
private List<File> files; 

@XmlElement(name="nEntries") 
public int getnEntries() {...} 

public void setnEntries(int nEntries) {...} 

@XmlElement(name="name") 
public String getName() {... } 

public void setName(String name) {... } 

@XmlElement(name="readonly") 
public boolean isReadonly() {... } 

public void setReadonly(boolean readonly) { ... } 

@XmlElement (name="created") 
public String getCreated() { ... } 

public void setCreated(String created) { ... } 

@XmlElement(name="modified") 
public String getModified() {... } 

public void setModified(String modified) {... } 

@XmlElements(
     @XmlElement(name="directory", type=Directory.class) 
) 
public List<Directory> getDirectories() { 
    return directories; 
} 

public void setDirectories(List directories) { 
    this.directories = directories; 
} 

@XmlElements(
     @XmlElement(name="file", type=File.class) 
) 
public List<File> getFiles() { 
    return files; 
} 

public void setFiles(List files) { 
    this.files = files; 
} 
} 



public class File { 

private List<String> tPathList; 
private List<String> oPathList; 

@XmlElement(name="xferStatus") 
public int getXferStatus() {...} 

public void setXferStatus(int xferStatus) {...} 

@XmlElement(name="size") 
public int getSize() {...} 

public void setSize(int size) {...} 


@XmlElement(name="tPath") 
public String gettPath() {...} 

public void settPath(String tPath) {...} 

@XmlElement(name="oPath") 
public String getoPath() {...} 

public void setoPath(String oPath) {...} 

@XmlElementWrapper(name="tPathList") 
@XmlElements(
     @XmlElement(name="tPath", type=String.class) 
) 
public List gettPathList() { 
    return tPathList; 
} 

public void settPathList(List tPathList) {...} 

@XmlElementWrapper(name="oPathList") 
@XmlElements(
     @XmlElement(name="oPath", type=String.class) 
) 
public List getoPathList() { 
    return oPathList; 
} 

public void setoPathList(List oPathList) { 
    this.oPathList = oPathList; 
} 
} 
+4

trouvé le problème. Si cela aide quelqu'un - 'setFiles (Liste des fichiers)' dans la classe File, devrait être 'setFiles (Liste fichiers)' Désolé pour le poste :) –

+0

a ajouté ceci est une réponse. – Reddy

+3

Ne dites pas désolé, j'ai fait exactement la même erreur et ce poste m'a aidé à le résoudre. – 3urdoch

Répondre

5

problème est résolu par OP lui-même, en ajoutant comme une réponse.

a trouvé le problème. Si cela aide n'importe qui:

setFiles(List files) dans la classe File, devrait être setFiles(List<File> files).

+0

juste une précision, le getter et le setter devraient être ** le même **, avec ou sans le type générique – Kevin

+1

Avait une exception très similaire quand j'ai réussi à renommer le getter sans renommer aussi le getter pour une liste <>. L'erreur n'est pas très utile, mais cette année était, merci! – Jon

1

J'ai également eu la même exception. mais la solution était différente. Je partage ici, pour les futurs résolveurs de problèmes. Lorsque vous appelez JAXBContext.newInstance(), regardez l'objet retourné.

Habituellement, il devrait être de type com.sun.xml.bind.v2.runtime.JAXBContextImpl. Cependant, si cela vient d'une bibliothèque de glassfish3 comme:

jar:file.../glassfish3/glassfish/modules/jaxb-osgi.jar 

qui m'a lancé la même exception. A changé l'ordre de classpath, et enfin le unmarshalling a bien fonctionné, si le JAXBContext.newInstance() trouve la première mise en œuvre JAXBContext classe de ce pot:

jar:file:.../.m2/repository/com/sun/xml/bind/jaxb-impl/2.x.x/jaxb-impl-2.x.x.jar