【发布时间】:2013-08-16 16:43:13
【问题描述】:
我在 grails 中有一个域类,它只应使用相同的名称创建一次。为了确保我有一个静态方法 getColor 和私有构造函数,如下所示:
class Color {
String name
static hasMany = [moods: Mood]
// not accessible
private Color() {}
// not accessible because getColor should be used
private Color(String name) {
this.name = name
}
static getColor(String name) {
def color = Color.findByName(name.toLowerCase())
color ? color : new Color(name).save(flush:true)
}
def beforeValidate() {
name = name.toLowerCase();
}
}
为了确保仅使用静态 getColor 方法创建 Color 对象,我想将构造函数设为私有。到目前为止,它工作得很好,我可以创建颜色对象。但是当我使用这个实例来创建 Object Mood 的对象时
class Mood {
static belongsTo = [color:Color]
}
def color = Color.getColor('verylightgreen')
def mood = new Mood(color: color)
我得到一个例外:
error initializing the application: Could not instantiate bean class [de.tobi.app.Color]: Is the constructor accessible?
这个异常是由
抛出的def mood = new Mood(color: color)
那么为什么创建 Mood 需要访问 Color 的构造函数。我已经通过了对象.. 一般来说,在 groovy/grails 中隐藏域类的构造器以控制对象的创建方式的最佳方法是什么。特别是地图控制器的使用也应该被禁用。
【问题讨论】:
-
为什么不用枚举来做这种事情呢?
-
因为用户应该能够动态添加新对象
-
我认为您应该考虑通过数据库约束强制执行唯一性。
-
是的,我也考虑过,我认为这将是一个替代方案.. 但我仍然认为,因为它是一种广泛传播的编程模式,想要在某些情况下控制对象创建,它应该是可能的太时髦了
-
是什么阻碍了您将
name设为主键?Color与Mood是如何关联的?
标签: grails groovy grails-orm