我在 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 中隐藏域类的构造器以控制对象的创建方式的最佳方法是什么。特别是地图控制器的使用也应该被禁用。