2014-10-22 77 views
2

我想創建模型類下面的xml:JAXB解組使用Groovy

<Response> 
    <Success>N</Success> 
    <Errors> 
     <Error> 
      <Number>29002</Number> 
      <Message>A key field was missing from the control xml</Message> 
     </Error> 
     <Error> 
      <Number>29004</Number> 
      <Message>Unable to accept messages at this time</Message> 
     </Error> 
    </Errors> 
</Response> 

這是我Response.class

@XmlRootElement (name="Response") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Response { 

    @XmlElement(name="Success") 
    private String success 

    @XmlElement(name="Errors") 
    private Errors errors 

    public String getSuccess() { 
    return success 
    } 

    public Errors getErrors() { 
    return errors; 
    } 
} 

這是我Errors.class

@XmlRootElement(name="Errors") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Errors { 

    public Errors() { 
    errorList = new ArrayList<Error>() 
    } 

    @XmlElement(name = "Errors") 
    private List<Error> errorList; 

    public List<Error> getErrorList() { 
    return errorList 
    } 
} 

這是我的Error.class

@XmlRootElement(name="Error") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Error { 

    @XmlElement(name="Number") 
    private int number 

    @XmlElement(name="Message") 
    private String message 


    public int getNumber() { 
     return number 
    } 

    public String getMessage() { 
     return message 
    } 
} 

下面是我的解組類UnmarshallResponse.class

try { 
//XML and Java binding 
    JAXBContext jaxbContext = JAXBContext.newInstance(Response.class) 

    //class responsible for the process of de-serializing 
    //XML data into Java object 
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
    Source source = new StreamSource(new java.io.StringReader(myXml)) 
    //log.info("source: "+myXml.toString()) 

    Response response = (Response) jaxbUnmarshaller.unmarshal(source) 

    //print the response for debugging 
    log.info("Success: " + response.getSuccess()) 

    Errors errors = response.getErrors() 
    List<Error> errorList = errors.getErrorList() 
    log.info("Size of Error List: " + errorList.size()) 
    errorList.each { 
    Error element 
    log.info("errorNumber: " + element.getNumber()) 
    log.info("errorMessage: " + element.getMessage()) 
    } 
    log.info("End of XML.") 
}catch (JAXBException e) { 
    log.error("JAXBException: "+e.getMessage()) 
} 

我能夠獲得成功的價值,但錯誤列表不來了,它顯示錯誤列表大小爲0的輸出如下到來:

成功:N 錯誤列表的大小:0

任何人可以幫助我瞭解,我很想念在哪裏?

感謝

回答

1

您已經命名自己的Error元素Errors(介意s末)。請參閱Errors.errorList。因此JAXB不會處理您的Error元素。

順便說一句,你不一定需要Errors類。您可以改用@XmlElementWrapper(name="Errors")

+0

感謝您的快速回復。它解決了這個問題。 – Anzar 2014-10-22 06:27:51

1

我現在能夠解決這個問題。

下面的變化我做:

我刪除了Errors.class

進行更改後我在做Response.class:

@XmlRootElement (name="Response") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Response { 

    public Response() { 
    errorList = new ArrayList<Error>() 
    } 

    @XmlElement(name="Success") 
    private String success 

    @XmlElementWrapper(name = "Errors") 
    @XmlElement(name = "Error") 
    private List<Error> errorList; 


    public String getSuccess() { 
    return success 
    } 

    public List<Error> getErrorList() { 
    return errorList 
    } 
} 

這種變化之後,我能夠獲取錯誤列表如下:

成功:N

錯誤列表的大小:2

errorNumber:29002

的errorMessage:一個關鍵領域是從控制XML失蹤

errorNumber:29004

的errorMessage:此時無法

接受郵件
+0

幹得好,非常好,你已經報告了完整的解決方案。 – lexicore 2014-10-22 06:59:25