Grails имеет очень хорошую поддержку для привязки параметров запроса к объекту домена и ассоциациям. Это в значительной степени зависит от обнаружения параметров запроса, заканчивающихся .id
и автоматически загружая их из базы данных.
Однако неясно, как заполнить ассоциации объекта команды. Возьмем следующий пример:
class ProductCommand {
String name
Collection<AttributeTypeCommand> attributeTypes
ProductTypeCommand productType
}
Этот объект имеет одностороннюю связь с ProductTypeCommand
и многопользовательскую связь с AttributeTypeCommand
. Список всех типов атрибутов и типов продуктов доступен из реализации этого интерфейса
interface ProductAdminService {
Collection<AttributeTypeCommand> listAttributeTypes();
Collection<ProductTypeCommand> getProductTypes();
}
Я использую этот интерфейс для заполнения списков выбора типа продукта и атрибутов в GSP. Я также зависим - вставляю этот интерфейс в объект команды и использую его для "имитации" attributeTypes
и productType
свойств объекта команды
class ProductCommand {
ProductAdminService productAdminService
String name
List<Integer> attributeTypeIds = []
Integer productTypeId
void setProductType(ProductTypeCommand productType) {
this.productTypeId = productType.id
}
ProductTypeCommand getProductType() {
productAdminService.productTypes.find {it.id == productTypeId}
}
Collection<AttributeTypeCommand> getAttributeTypes() {
attributeTypeIds.collect {id ->
productAdminService.getAttributeType(id)
}
}
void setAttributeTypes(Collection<AttributeTypeCommand> attributeTypes) {
this.attributeTypeIds = attributeTypes.collect {it.id}
}
}
Фактически происходит то, что свойства attributeTypeIds
и productTypeId
привязаны к соответствующим параметрам запроса, а свойства "имитировать" геттеры/сеттеры "имитируют" productType
и attributeTypes
. Существует ли более простой способ заполнения ассоциаций объекта команды?