加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数据绑定 – Grails命令对象数据绑定

发布时间:2020-12-14 16:38:52 所属栏目:大数据 来源:网络整理
导读:Grails有一个 very good support绑定请求参数到域对象及其关联。这主要依赖于检测以.id结尾的请求参数并自动从数据库加载这些参数。 但是,不清楚如何填充命令对象的关联。请参见以下示例: class ProductCommand { String name CollectionAttributeTypeComm
Grails有一个 very good support绑定请求参数到域对象及其关联。这主要依赖于检测以.id结尾的请求参数并自动从数据库加载这些参数。

但是,不清楚如何填充命令对象的关联。请参见以下示例:

class ProductCommand {

    String name
    Collection<AttributeTypeCommand> attributeTypes 
    ProductTypeCommand productType
}

此对象具有与ProductTypeCommand的单端关联以及与AttributeTypeCommand的多端关联。所有属性类型和产品类型的列表都可以从此接口的实现中获得

interface ProductAdminService {
    Collection<AttributeTypeCommand> listAttributeTypes();
    Collection<ProductTypeCommand> getProductTypes();
}

我使用此接口填充GSP中的产品和属性类型选择列表。我也依赖注入这个接口到命令对象,并使用它来“模拟”属性类型和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属性绑定到相关的请求参数和getters / setters“simulate”productType和attributeTypes属性。有一个更简单的方法来填充命令对象的关联?

解决方法

你实际上需要为attributeTypes和productType属性提供子命令吗?任何原因你不使用PropertyEditorSupport绑定?例如。:

public class ProductTypeEditor extends PropertyEditorSupport
{
    ProductAdminService productAdminService // inject somewhow
    void setAsText(String s)
    {
        if (s) value = productAdminService.productTypes.find { it.id == s.toLong() }
    }

    public String getAsText()
    {
        value?.id        
    }
}

(和attributeType对象类似的东西),并在编辑器注册器中注册这些:

import java.beans.PropertyEditorSupport
public class CustomEditorRegistrar implements PropertyEditorRegistrar {
    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(ProductType,new ProductTypeEditor())
        reg.registerCustomEditor(AttributeType,new AttributeTypeEditor())
    }
}

并注册在您的resources.groovy:

beans =
{
    customEditorRegistrar(CustomEditorRegistrar)
}

那么在你的Cmd你只有:

class ProductCommand {
    String name
    List<AttributeType> attributeTypes = []
    ProductType productType
}

如果你确实需要实际的子命令关联,那么我做了一些类似于@Andre Steingress建议的,结合PropertyEditorSupport绑定:

// parent cmd
import org.apache.commons.collections.ListUtils
import org.apache.commons.collections.FactoryUtils
public class DefineItemConstraintsCmd implements Serializable
{
    List allItemConstraints = ListUtils.lazyList([],FactoryUtils.instantiateFactory(ItemConstraintsCmd))
    //...
}    
// sub cmd
@Validateable
class ItemConstraintsCmd implements Serializable
{
    Item item // this has an ItemEditor for binding
    //...
}

希望我没有误解你试图实现:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读