2014-10-22 74 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