假设我有Employee域类,我想从UI端的params map创建域类的对象。
我可以通过以下两种方式创建对象
员工雇员=新员工(姓名:params.name,rollNo: params.rollNo)
等等。如果domain类有20个变量,那么我们需要在上面的构造函数中编写所有变量。
员工员工=新员工(参数)
上面的构造函数将使用匹配的参数填充对象。右。
现在我的问题来了。
如果假设我从DB获取了现有的域类对象,现在我想从来自UI的params map更新此对象。 什么是最好的方法(就像我们在上面的第二个选项中所做的那样)。
答案 0 :(得分:0)
我认为最好使用命令对象并将其绑定到Employee。
这里是示例伪代码:
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(并排除你不想要绑定的任何字段):
bindData(editEmp, params, [exclude:['firstName', 'lastName']])
答案 1 :(得分:0)
如果要在服务类中实现此目标,请使服务实现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)
}
}