我在 grails 中有一个域类,应该只用相同的名称创建一次。为了确保我有一个静态方法 getColor 和私有(private)构造函数,如下所示:
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 对象,我想将构造函数设为私有(private)。到目前为止,它工作得很好,我可以创建颜色对象。但是当我使用这个实例来创建 Object Mood 的对象时
class Mood {
static belongsTo = [color:Color]
}
def color = Color.getColor('verylightgreen')
def mood = new Mood(color: color)
我得到一个异常(exception):
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 中隐藏域类的构造器以控制对象的创建方式的最佳方法是什么。特别是 map Controller 的使用也应该被禁用。
最佳答案
使用 name
作为 Color
的主键你可以实现独特性。另外,findOrSaveBy*可用于替换自定义静态方法getColor
.
如果制作name
主键不是一个可行的选择,那么您可以继续添加几乎所有个人在对该问题的评论中提到的约束。 :)
class Color {
String name
static mapping = {
//column is optional
id name: 'name', generator: 'assigned', type: 'string', column: 'NAME'
}
static hasMany = [moods : Mood] //for example
//DO NOT NEED THIS
//This can be achieved by findOrSaveBy*
/*static getColor(String name) {
def color = Color.findByName(name.toLowerCase())
color ? color : new Color(name).save(flush:true)
}*/
def beforeValidate() {
name = name.toLowerCase();
}
}
那么你可以很好地做到
def color = Color.findOrSaveByName('verylightgreen')
def mood = new Mood()
color.addToMoods(mood)
color.save()
关于grails - Groovy/Grails 如何使构造函数私有(private) - 正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18278272/