2014-04-15 114 views
2

我想解開編組的對象,它沒有註釋。JAXB Unmarshall沒有註釋

這是我的對象類。

class Student { 
    private String name; 
    private int age; 

    public Student() { 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getAge() { 
     return age; 
    } 
} 

這是我用來編組對象的東西。

public String marshall(Student student){ 
     StringWriter writer = new StringWriter(); 
     JAXBContext context; 
     try { 
      context = JAXBContext.newInstance(Student.class); 
      Marshaller m = context.createMarshaller(); 

      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      JAXBElement<Student> rootElement = new JAXBElement<Student>(new QName("student"), Student.class, student); 
      m.marshal(rootElement, writer); 
      return writer.toString(); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

這是我用來解組對象的東西。

public Student unMarshall(String input){ 
     JAXBContext context; 
     try { 
      context = JAXBContext.newInstance(Student.class); 
      Unmarshaller m = context.createUnmarshaller(); 
      return (Student) m.unmarshal(new StringReader(input)); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

當我試圖來解讀,我得到的波紋錯誤

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"student"). Expected elements are (none) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:648) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:231) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1051) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:484) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3104) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647) 
    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:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194) 
    at noannotation.Main.unMarshel(Main.java:49) 
    at noannotation.Main.main(Main.java:22) 

我怎樣才能解決這個問題?

回答

2

你只需要使用的unmarshal方法是採取Class參數之一。

public Student unMarshall(String input){ 
    JAXBContext context; 
    try { 
     context = JAXBContext.newInstance(Student.class); 
     Unmarshaller m = context.createUnmarshaller(); 
     StreamSource source = new StreamSource(new StringReader(input)) 
     return m.unmarshal(source, Student.class).getValue(); 
    } catch (JAXBException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

更多信息

您可以找到有關這種使用情況在我的博客的更多信息:

+0

謝謝你的答案。我以前檢查過你的博客。我想添加StreamSource。但我無法弄清楚如何。它沒有考慮從字符串創建StreamSource。 –