2011-06-15 112 views
7

我正在使用一個我沒有控制權的API,它返回XML。 基本上我有directory對象,它可以包含多個directoryfile對象,這些對象不包含任何標記,也包含其他幾個原始字段。 file對象包含幾個原始字段以及由tPathListoPathList標籤包裝的2個列表。幫助解決JAXB解組問題NPE

下面是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> 

我已創建目錄和文件的對象,和OpenDirectory這是根。當我打電話

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

我得到以下異常:

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) 

我計算過,它涉及到的是我的列表中的一個,但我想不出我有什麼錯。任何幫助,將不勝感激。

在此先感謝。

下面是類(減去幾個字段/方法):

@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

發現問題。如果它有幫助 - 'setFiles(List files)'在File類中,應該是'setFiles(列表文件)' 對不起,對於這篇文章:) – 2011-06-15 15:59:10

+0

添加這是一個答案。 – Reddy 2011-09-22 10:32:06

+3

不要說對不起,我犯了同樣的錯誤,這篇文章幫助我解決了這個問題。 – 3urdoch 2012-04-11 15:05:34

回答

5

問題是由OP自己解決,將其作爲一個答案。

發現問題。如果它對任何人有幫助:

setFiles(List files) in File class,應該是setFiles(List<File> files)

+0

只是一個精度,getter和setter應該是**相同的**類型,有或沒有泛型類型 – Kevin 2012-04-30 19:41:38

+1

有一個非常類似的異常,當我設法重命名getter而不重命名List <>的getter。這個錯誤並不是很有幫助,但是這個問題是,謝謝! – Jon 2015-05-28 08:10:48

1

我也有同樣的例外。但解決方案是不同的。我在這裏分享它,以便將來解決問題。當你調用JAXBContext.newInstance()時,看看返回的對象。

通常它應該是com.sun.xml.bind.v2.runtime.JAXBContextImpl。但是,如果它來自一些glassfish3庫如:

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

,這拋出了我同樣的例外。一改classpath的順序,最後解組工作得很好,如果JAXBContext.newInstance()從這個罐子找到的第一個實施JAXBContext類:

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