0

我的域类中有几个属性。但是,我只希望通过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属性。我怎样才能阻止这个?

4

2 回答 2

1

您可能可以做以下几件事之一:

  1. 如果它有很多属性,请在您的域类中创建一个transient beforeInsert() {}和/或transient beforeUpdate() {}方法并处理设置(或不设置)属性。
  2. 如果只有少数,请覆盖域类中的设置器。

由于 Groovy 让我不想弄乱 getter 和 setter,除非我绝对必须这样做,所以我通常使用beforeInsertandbeforeUpdate方法。

于 2013-06-06T20:24:56.160 回答
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,我还建议您考虑使用命令对象进行数据绑定。

于 2013-06-07T22:46:47.313 回答