Когда мы конвертируем 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.groovy import com.mrhaki.grails.sample.Book import grails.converters.XML import org.codehaus.groovy.grails.web.converters.marshaller.xml.CollectionMarshaller class 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.