我正在使用一個我沒有控制權的API,它返回XML。 基本上我有directory
對象,它可以包含多個directory
和file
對象,這些對象不包含任何標記,也包含其他幾個原始字段。 file
對象包含幾個原始字段以及由tPathList
和oPathList
標籤包裝的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;
}
}
發現問題。如果它有幫助 - 'setFiles(List files)'在File類中,應該是'setFiles(列表文件)' 對不起,對於這篇文章:) –
2011-06-15 15:59:10
添加這是一個答案。 – Reddy 2011-09-22 10:32:06
不要說對不起,我犯了同樣的錯誤,這篇文章幫助我解決了這個問題。 – 3urdoch 2012-04-11 15:05:34