我正在使用Grails 2.5.3并拥有域类Person。
我创建了一个Person的XML编组器,它创建了一个以“person”作为根元素名称的XML。根据人的角色,我想将根元素命名为“患者”或“医生”,但Grails中没有文档,实施者网站也没有关于此的文档。
我唯一能找到的是如何自定义集合XML marshallers的根元素名称,例如:Grails XML marshalling: change default "<list>" root element name
有没有办法自定义对象XML marshallers的根元素名称?
目前我所拥有的是:
XML.registerObjectMarshaller(Person) { person, xml ->
xml.build {
uid(person.uid)
firstName(person.firstName)
lastName(person.lastName)
dob(person.dob)
sex(person.sex)
idCode(person.idCode)
idType(person.idType)
organizationUid(person.organizationUid)
}
}
答案 0 :(得分:2)
您使用的registerObjectMarshaller
方法有一个带有ObjectMarshaller
实例的重载。要覆盖根元素的名称,您注册的编组器还需要实现NameAwareMarshaller
接口。
您链接的帖子中的答案通过注册一个从CollectionMarshaller
扩展的对象来处理所有这一切,ObjectMarshaller
是NameAwareMarshaller
和ObjectMarshaller
的实现者。
要按照您希望的方式自定义根元素名称,您需要创建一个实现NameAwareMarshaller
和registerObjectMarshaller
的类。您对ObjectMarshaller.marshallObject(...)
方法的使用是通过class PersonMarshaller implements ObjectMarshaller<XML>, NameAwareMarshaller {
boolean supports(Object object) {
return object instanceof Person;
}
String getElementName(Object o) {
if (object instanceof Patient) {
return "patient";
} else if (object instanceof Doctor) {
return "doctor";
} else {
return "patient";
}
}
void marshalObject(Object object, XML xml) {
Person person = (Person) object;
xml.build {
uid(person.uid)
firstName(person.firstName)
lastName(person.lastName)
dob(person.dob)
sex(person.sex)
idCode(person.idCode)
idType(person.idType)
organizationUid(person.organizationUid)
}
}
}
正在使用的闭包。您可以在新类的marshalObject方法实现中使用闭包体。
curl -H "Content-type: application/xml" -vX POST 'http://blablablabla@local.acme.net/api/products/' -d "<?xml version=\"1.0\"
encoding=\"UTF-8\"?>
<prestashop xmlns:xlink=\"http://www.w3.org/1999/xlink\">
<product>
</product>
</prestashop>"