2011-06-15 19 views
7

मैं एक ऐसे एपीआई के साथ काम कर रहा हूं जिस पर मेरा नियंत्रण नहीं है, जो एक्सएमएल लौटाता है। असल में मेरे पास directory ऑब्जेक्ट है जिसमें कई directory और file ऑब्जेक्ट्स शामिल हो सकते हैं जो कुछ अन्य आदिम फ़ील्ड के बीच किसी भी टैग द्वारा लिपटे नहीं हैं। file ऑब्जेक्ट में कुछ आदिम फ़ील्ड हैं, और 2 सूचियां जो tPathList और oPathList टैग द्वारा लिपटे हैं।समस्या निवारण JAXB unmarshalling एनपीई

<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 जो जड़ है बनाया है:

नीचे जैसे XML का एक उदाहरण है। जब मैं फोन

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

मिले समस्या। अगर यह फ़ाइल वर्ग में 'सेटफाइल (सूची फाइलें) 'की मदद करता है, तो सेटफाइल (सूची फाइलें)' पोस्ट के लिए खेद है :) –

+0

जोड़ा गया यह एक उत्तर है। – Reddy

+3

क्षमा न करें, मैंने बिल्कुल वही गलती की है और इस पोस्ट ने मुझे इसे हल करने में मदद की है। – 3urdoch

उत्तर

5

समस्या खुद ओपी द्वारा हल किया जाता है, एक जवाब के रूप में जोड़ने:

नीचे वर्गों (शून्य से कुछ क्षेत्रों/विधि) कर रहे हैं।

समस्या मिली। अगर यह किसी की मदद करता है:

setFiles(List files) फ़ाइल कक्षा में, setFiles(List<File> files) होना चाहिए।

+0

बस एक परिशुद्धता, गेटर और सेटर ** एक ही ** प्रकार होना चाहिए, सामान्य प्रकार के साथ या बिना सामान्य प्रकार – Kevin

+1

एक बहुत ही अपरिचित अपवाद था जब मैं गेटटर का नाम बदलने के बिना किसी सूची <> के लिए गेटर का नाम बदलने में कामयाब रहा। त्रुटि बहुत उपयोगी नहीं है, लेकिन यह उत्तरदाता था, धन्यवाद! – Jon

1

मेरे पास भी एक ही अपवाद था। लेकिन समाधान अलग था। भविष्य में समस्या हलकों के लिए, मैं इसे यहां साझा करता हूं। जब आप JAXBContext.newInstance() का आह्वान करते हैं, तो लौटे ऑब्जेक्ट पर एक नज़र डालें।

आमतौर पर यह com.sun.xml.bind.v2.runtime.JAXBContextImpl प्रकार का होना चाहिए। हालांकि यह कुछ glassfish3 पुस्तकालय की तरह से आता है, तो: कि मुझे एक ही अपवाद दिए

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

। एक classpath का क्रम बदल, और अगर JAXBContext.newInstance() इस जार से पहले लागू करने JAXBContext वर्ग पाता अंत में unmarshalling ठीक काम किया,:

jar:file:.../.m2/repository/com/sun/xml/bind/jaxb-impl/2.x.x/jaxb-impl-2.x.x.jar 
संबंधित मुद्दे