JAXB解组使用Groovy
问题描述:
我想创建模型类下面的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
任何人可以帮助我了解,我很想念在哪里?
感谢
答
您已经命名自己的Error
元素Errors
(介意s
末)。请参阅Errors.errorList
。因此JAXB不会处理您的Error
元素。
顺便说一句,你不一定需要Errors
类。您可以改用@XmlElementWrapper(name="Errors")
。
答
我现在能够解决这个问题。
下面的变化我做:
我删除了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
感谢您的快速回复。它解决了这个问题。 – Anzar 2014-10-22 06:27:51