ОБНОВЛЕНО: Это может оказаться ошибкой Grails. Пожалуйста, смотрите:Связывание данных Grails завершается сбоем, когда запрос XML содержит одноэлементную коллекцию
- http://grails.1312388.n4.nabble.com/Data-binding-fails-when-XML-request-contains-single-element-collection-td4654637.html
- http://jira.grails.org/browse/GRAILS-11175
Я против любопытной проблемы, где связывания данных происходит сбой, если входящее тело запроса XML содержит коллекцию 1 элемент. Для 2 или более элементов все хорошо.
У меня есть следующий командный объект:
class MyCommand {
Set<Something> somethings
}
И у меня есть следующий ПЫЙ (не класс домена):
class Something {
String name
}
Я использую команду следующим образом:
def save(MyCommand command) {
respond command
}
Все подходит для следующего ввода:
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
<something>
<name>Something 2</name>
</something>
</somethings>
</myCommand>
Но не для этого входа:
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
</somethings>
</myCommand>
я вижу следующее сообщение об ошибке сервера (Grails пытался эффективно называть "новый Set()"):
java.lang.NoSuchMethodException: java.util.Set.<init>()
Вот интересно part: Если я делаю Something
объект домена, переместив его в директорию «домен» Grails, вышеуказанная ошибка не возникает. Смысл, даже если тело запроса содержит единую XML-коллекцию элементов, Grails создаст набор с одним элементом и исключений не будет.
Кроме того, если тело запроса содержит JSON вместо XML, все хорошо даже без использования доменных объектов: запрос может содержать коллекцию отдельных элементов, а Grails по-прежнему мгновенно запускает мой командный объект. Я предполагаю, что это работает, потому что JSON явно определяет тип коллекции.
Вопрос: Как я могу использовать объекты команд и все еще потреблять запросы, содержащие одноэлементные коллекции XML?
Технически я мог бы написать свою собственную привязку для этого свойства с помощью @BindUsing и проверить, является ли исходная карта не коллекцией, если да, то сделайте ее одноэлементной коллекцией. Но это не сработает для меня, потому что я упростил проблему, и что-то имеет много собственных вложенных свойств, поэтому попытка создать экземпляр этого потребует много ручной работы.
Заранее за вашу помощь. :-)
Интересно, что у ROR также есть эта проблема. Другим обходным решением для меня был более простой фиктивный элемент без данных: ' '. Используя этот синтаксис, Grails даже не включил дополнительный элемент в массив (массив был единственным элементом, который я хотел). –