Привязка данных Grails - командные объекты со списками - PullRequest
2 голосов
/ 15 марта 2012

Grails 1.3.7

Проблема с привязкой данных Командные объекты, которые имеют содержимое списка.Пример команды:

class Tracker {
    String name
    String description
    List<Unit> units = new ArrayList()
}

class Unit {
    String name
    Long unitMax
    Long unitMin
}

create GSP для Tracker имеет поля Unit.Один пример:

<g:textField name="units[0].unitMax" value=""/>

Метод сохранения TrackerController:

 def save = { Tracker trackerInstance ->
   trackerInstance = trackingService.saveOrUpdateTracker(trackerInstance)
 }

Но всегда java.lang.IndexOutOfBoundsException

В качестве альтернативы, если я обновлю контроллер до:

def save = {
   Tracker trackerInstance = new Tracker()
   trackerInstance.properties = params
   ....

Тогда groovy.lang.ReadOnlyPropertyException: Невозможно установить свойство только для чтения: свойства для класса: com.redbrickhealth.dto.Tracker Есть идеи?

Кажется, есть разница между связыванием в объектах GORM и Command.

Может быть, мне нужно расширить и зарегистрировать PropertyEditorSupport для модуля?

-Todd

Ответы [ 2 ]

6 голосов
/ 21 сентября 2013

Начиная с Groovy 1.8.7, интерфейс List имеет метод с именем withLazyDefault, который можно использовать вместо общих Apache ListUtils:

List<Unit> units = [].withLazyDefault { new Unit() }

Это создает новый Unit экземпляр каждый раз, когда к units обращаются с несуществующим индексом.

См. Документацию withLazyDefault для получения более подробной информации. Я также написал небольшое сообщение в блоге об этом несколько дней назад.

4 голосов
/ 15 марта 2012

Grails требуется команда с существующим списком, которая будет заполнена данными из запроса.

Если вы знаете точное количество единиц, скажем, 3, вы можете:

class Tracker {
    String name
    String description
    List<Unit> units = [new Unit(), new Unit(), new Unit()]
}

или использовать LazyList из коллекций Apache Commons

import org.apache.commons.collections.ListUtils
import org.apache.commons.collections.Factory
class Tracker {
    String name
    String description
    List<Unit> units = ListUtils.lazyList([], {new Unit()} as Factory)
}
...