Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 用大量变量更新域类对象的最佳方法是什么_Grails_Groovy_Constructor - Fatal编程技术网

Grails 用大量变量更新域类对象的最佳方法是什么

Grails 用大量变量更新域类对象的最佳方法是什么,grails,groovy,constructor,Grails,Groovy,Constructor,假设我有Employee域类,我想从UI端的参数映射创建域类的对象 我可以用以下两种方法创建对象 正常方式 Employee Employee=新员工(名称:params.name,rollNo: 参数(否) 等等。若域类有20个变量,那个么我们需要在上述构造函数中写入所有变量 下面是创建对象的最佳方法 员工=新员工(参数) 上面的构造函数将用匹配的参数填充对象。对 现在我的问题来了 若假设我已经从DB中提取了现有的域类对象,那个么现在我想从UI中的参数映射更新这个对象。 最好的方法是什么(就像

假设我有Employee域类,我想从UI端的参数映射创建域类的对象

我可以用以下两种方法创建对象

  • 正常方式
  • Employee Employee=新员工(名称:params.name,rollNo: 参数(否)

    等等。若域类有20个变量,那个么我们需要在上述构造函数中写入所有变量

  • 下面是创建对象的最佳方法
  • 员工=新员工(参数)

    上面的构造函数将用匹配的参数填充对象。对

    现在我的问题来了

    若假设我已经从DB中提取了现有的域类对象,那个么现在我想从UI中的参数映射更新这个对象。
    最好的方法是什么(就像我们在上面第二个选项中所做的那样)。

    我认为最好使用命令对象并将其绑定到员工

    以下是示例伪代码:

    class EmployeeMgmtController {
        def editEmp(EmployeeCmd cmd){
            Employee editEmp = Employee.get(1)
            editEmp.properties = cmd
            editEmp.save()
        }
    }
    
    class EmployeeCmd{
        String id
    
        static constraints = {
            id blank:false,nullable:false
        }
    }
    
    或者

    如果您在控制器上,并且仍然希望使用params(并排除任何不希望绑定的字段),请执行以下操作:


    我认为最好使用命令对象并将其绑定到员工

    以下是示例伪代码:

    class EmployeeMgmtController {
        def editEmp(EmployeeCmd cmd){
            Employee editEmp = Employee.get(1)
            editEmp.properties = cmd
            editEmp.save()
        }
    }
    
    class EmployeeCmd{
        String id
    
        static constraints = {
            id blank:false,nullable:false
        }
    }
    
    或者

    如果您在控制器上,并且仍然希望使用params(并排除任何不希望绑定的字段),请执行以下操作:


    如果您想在服务类中实现这一点,请让您的服务实现
    grails.web.databinding.DataBinder
    ,然后使用
    bindData
    方法,如下所示

    import grails.web.databinding.DataBinder
    
    class MyAwesomeService implements DataBinder {
    
        /**
        * Updates the given instance of a domain class to have attribute values specified
        * in "newData" map.
        */
        MyDomain updateMyDomainAttributes(MyDomain myDomianInstance, Map newData) {
            bindData(myDomianInstance, newData)
            myDomianInstance.save(flush: true)
        }
    }
    

    如果您想在服务类中实现这一点,请让您的服务实现
    grails.web.databinding.DataBinder
    ,然后使用
    bindData
    方法,如下所示

    import grails.web.databinding.DataBinder
    
    class MyAwesomeService implements DataBinder {
    
        /**
        * Updates the given instance of a domain class to have attribute values specified
        * in "newData" map.
        */
        MyDomain updateMyDomainAttributes(MyDomain myDomianInstance, Map newData) {
            bindData(myDomianInstance, newData)
            myDomianInstance.save(flush: true)
        }
    }
    

    我不会同时设置很多字段。有人可能会操纵他们的帖子,一个不在表单上供他们填写的更新字段。这将很难发现、发现和修复。只需将字段设置为正常值。虽然如果你在一页上有20件东西,我会说太多了…我不会同时设置很多字段。有人可能会操纵他们的帖子,一个不在表单上供他们填写的更新字段。这将很难发现、发现和修复。只需将字段设置为正常值。虽然如果你一页上有20件东西,我会说那太多了……你不回答他的问题。他问的是更新,不是创建对象。几乎一样。。谢谢你发现了。我编辑的,你不回答他的问题。他问的是更新,不是创建对象。几乎一样。。谢谢你发现了。我编辑了它。