2011-06-15 16 views
7

XML'leri döndüren, üzerinde denetim sahibi olmayan bir API ile çalışıyorum. Temel olarak, diğer ilkel alanlar arasında, herhangi bir etiket tarafından sarılmamış birden çok directory ve file nesneler içerebilen directory nesnesine sahibim. file nesnesi, birkaç ilkel alan ve tPathList ve oPathList etiketleriyle sarılmış 2 liste içerir. Ben köküdür Directory ve File nesneleri ve OpenDirectory yarattıkYardım sorunlarını giderme JAXB unmarshalling NPE

<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> 

:

Aşağıda bu tür XML örneğidir. Ben çağırdığınızda

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

alıyorum şu istisna:

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) 

bunu ben listelerinden birine ilgilidir düşündüm ama nerede yanlış yaptım çözemedim . Herhangi bir yardım takdir edilecektir.

Şimdiden teşekkürler.

@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

sorunu buldum. Dosya sınıfındaki herhangi birine - 'setFiles (Liste dosyaları)' yardımcı olursa, 'setFiles (Liste dosyaları)' Gönderi için özür dilerim :) –

+0

buna bir cevap ekledi. – Reddy

+3

Üzgünüm, aynı hatayı yaptım ve bu yazı çözmeme yardımcı oldu. – 3urdoch

cevap

5

Sorun bir cevap olarak ekleyerek, OP kendisi çözülür:

Aşağıda sınıfları (eksi birkaç alanları/yöntemleri) vardır.

Sorun bulundu. Dosya sınıfında

setFiles(List files) yardımcı olursa, setFiles(List<File> files) olmalıdır.

+0

sadece bir kesinlik, alıcı ve ayarlayıcı, ** **, jenerik tip – Kevin

+1

ile aynı tipte olmalıdır. Alıcının yeniden adlandırılması için bir alıcıya yeniden isim vermeden, çok daha farklı bir istisna vardı <>. Hata çok yararlı değil, ama bu anser oldu, teşekkürler! – Jon

1

Aynı özel durum da vardı. ama çözüm farklıydı. Gelecekteki problem çözücüler için burada paylaşıyorum. JAXBContext.newInstance()'u çağırdığınızda, döndürülen nesneye bakın. Genellikle, com.sun.xml.bind.v2.runtime.JAXBContextImpl türünde olmalıdır. Ancak, aynı istisnai attı gibi bazı glassfish3 kitaplığından gelirse:

. Bir sınıf yolunda sırasını değiştirdi ve JAXBContext.newInstance() bu kavanozdan ilk uygulayan JAXBContext sınıf bulursa nihayet unmarshalling, iyi çalıştı:

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