Статьи

Grails Goodness: настройка коллекций имен корневых элементов для XML Marshalling

Когда мы конвертируем 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.