Когда мы конвертируем List или Set в XML с помощью поддержки сортировки Grails XML, именем корневого элемента является либо <list> либо <set> . Мы можем изменить это имя, расширив org.codehaus.groovy.grails.web.converters.marshaller. xml.CollectionMarshaller org.codehaus.groovy.grails.web.converters.marshaller. xml.CollectionMarshaller . Мы должны переопределить метод supports() чтобы обозначить тип коллекции, для которой мы хотим настроить имя корневого элемента. И мы должны переопределить метод getElementName() который возвращает фактическое имя корневого элемента для List или Set .
Давайте сначала посмотрим вывод по умолчанию коллекции классов домена Book . В контроллере у нас есть следующий код:
|
01
02
03
04
05
06
07
08
09
10
11
|
package com.mrhaki.grails.sample class SampleController { def list() { // To force 404 when no results are found // we must return null, because respond method // checks explicitly for null value and // not Groovy truth. respond Book.list() }} |
Вывод XML:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?xml version="1.0" encoding="UTF-8"?><list> <book id="1" version="0"> <author id="1" /> <isbn> 0451169514 </isbn> <numberOfPages> 1104 </numberOfPages> <title> It </title> </book> <book id="2" version="0"> <author id="1" /> <isbn> 0307743683 </isbn> <numberOfPages> 1472 </numberOfPages> <title> The stand </title> </book></list> |
Чтобы изменить list имен элементов на books мы добавляем следующий код к закрытию init в grails-app/app/BootStrap.groovy :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// File: grails-app/conf/BootStrap.groovyimport com.mrhaki.grails.sample.Bookimport grails.converters.XMLimport org.codehaus.groovy.grails.web.converters.marshaller.xml.CollectionMarshallerclass BootStrap { def init = { servletContext -> // Register custom collection marshaller for List with Book instances. // The root element name is set to books. XML.registerObjectMarshaller(new CollectionMarshaller() { @Override public boolean supports(Object object) { // We know there is at least one result, // otherwise the controller respond method // would have returned a 404 response code. object instance of List && object.first() instance of Book } @Override String getElementName(final Object o) { 'books' } }) }} |
Теперь, когда мы отображаем список экземпляров Book мы получаем следующий XML:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?xml version="1.0" encoding="UTF-8"?><books> <book id="1" version="0"> <author id="1" /> <isbn> 0451169514 </isbn> <numberOfPages> 1104 </numberOfPages> <title> It </title> </book> <book id="2" version="0"> <author id="1" /> <isbn> 0307743683 </isbn> <numberOfPages> 1472 </numberOfPages> <title> The stand </title> </book></books> |
Чтобы настроить вывод XML-маршалинга для коллекций Map мы должны org.codehaus.groovy.grails.web.converters.marshaller.xml.MapMarshaller подкласс org.codehaus.groovy.grails.web.converters.marshaller.xml.MapMarshaller .
Код, написанный с помощью Grails 2.3.2.