如何限制从params设置的域的属性

时间:2013-06-06 17:50:45

标签: grails

我的域类中有几个属性。但是,我只希望通过params对象设置它们中的一些。有什么好办法呢?

示例:

class Color {
  String name
  String shade //don't want this set by params
}

控制器

class ColorController { 
  def save() {
     json {
       def c = new Color(params?.color)
       c.save(flush: true)
       //..more code
     }
  }
}

如果有人发送了以下请求:

  {"color": 
    {name: "red",
     shade: "light"
    }
  }

然后用户可以更改shade属性。我怎么能阻止这个?

2 个答案:

答案 0 :(得分:1)

你可能会做以下几件事之一:

  1. 如果有多个属性,请在域类中创建transient beforeInsert() {}和/或transient beforeUpdate() {}方法,并处理属性设置(或不设置)。
  2. 如果只有少数,则覆盖域类中的setter。
  3. 由于Groovy让我不想搞砸getter和setter,除非我绝对不得不这样做,我通常使用beforeInsertbeforeUpdate方法。

答案 1 :(得分:1)

Grails在控制器上提供了一个bindData方法,可以对数据绑定进行细粒度控制。对于您的示例,您可以将其写为:

class ColorController { 
  def save() {
     json {
       def c = new Color()
       bindData(c, params, [include: 'name'])
       c.save(flush: true)
       //..more code
     }
  }
}

在这种情况下,在尝试c之前,只会在save个实例上设置“名称”字段。

如果您想对传入的params进行额外验证,我还建议您使用Command Object进行数据绑定。