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