2014-03-04 1 views
0

ОБНОВЛЕНО: Это может оказаться ошибкой Grails. Пожалуйста, смотрите:Связывание данных Grails завершается сбоем, когда запрос XML содержит одноэлементную коллекцию

Я против любопытной проблемы, где связывания данных происходит сбой, если входящее тело запроса 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 и проверить, является ли исходная карта не коллекцией, если да, то сделайте ее одноэлементной коллекцией. Но это не сработает для меня, потому что я упростил проблему, и что-то имеет много собственных вложенных свойств, поэтому попытка создать экземпляр этого потребует много ручной работы.

Заранее за вашу помощь. :-)

ответ

0

Я ве получил тот же вопрос в моем проекте (по рельсам). Когда, например, rails преобразует xml в hash, он преобразует одноэлементную коллекцию в хеш (не массив), но если имеется более одного элемента, ROR преобразует его в массив хэшей (правильно). Это проблема коллекций xml.

Мое решение состояло в том, чтобы добавить фиктивный элемент в коллекции, поэтому я был уверен, что одноэлементные коллекции (которые теперь составляют 1 + dummy = 2 коллекции элементов) преобразуются в массивы.

<myCommand> 
     <somethings> 
       <something> 
         <name>Something 1</name> 
       </something> 
       <something> 
         <name>dummy</name> 
       </something> 
     </somethings> 
</myCommand> 
+0

Интересно, что у ROR также есть эта проблема. Другим обходным решением для меня был более простой фиктивный элемент без данных: ''. Используя этот синтаксис, Grails даже не включил дополнительный элемент в массив (массив был единственным элементом, который я хотел). –

 Смежные вопросы

  • Нет связанных вопросов^_^