如何在Grails中自定义对象XML marshaller的根元素名称

时间:2016-07-03 21:32:16

标签: xml grails

我正在使用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)
        }
}

1 个答案:

答案 0 :(得分:2)

您使用的registerObjectMarshaller方法有一个带有ObjectMarshaller实例的重载。要覆盖根元素的名称,您注册的编组器还需要实现NameAwareMarshaller接口。

您链接的帖子中的答案通过注册一个从CollectionMarshaller扩展的对象来处理所有这一切,ObjectMarshallerNameAwareMarshallerObjectMarshaller的实现者。

要按照您希望的方式自定义根元素名称,您需要创建一个实现NameAwareMarshallerregisterObjectMarshaller的类。您对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>"