Grails 使用getter样式的方法名向域类添加业务逻辑

Grails 使用getter样式的方法名向域类添加业务逻辑,grails,groovy,Grails,Groovy,我正在尝试向grails域类添加一个方法,例如 class Item { String name String getReversedName() { name.reverse() } } 当我尝试使用grails控制台加载应用程序时,出现以下错误: 原因:org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的bean时出错:调用init方法失败;嵌套异常为org.hi

我正在尝试向grails域类添加一个方法,例如

class Item {

  String name

  String getReversedName() {
    name.reverse()
  }

}
当我尝试使用grails控制台加载应用程序时,出现以下错误:

原因:org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的bean时出错:调用init方法失败;嵌套异常为org.hibernate.PropertyNotFoundException:在类项中找不到属性reversedName的setter ... 还有18个

看起来Hibernate正在将getReversedName()解释为属性的getter,但是在本例中,它是一个派生字段,因此不应持久化。显然,在我的实际代码中,我公开的业务逻辑更加复杂,但它与这个问题无关。我希望能够在我的代码/GSP中调用item.reversedName


如果Grails不尝试使用Hibernate映射Grails域类中的方法,我如何提供对该方法的属性(getter)访问?

我相信您有两种选择:

1) 使用def

2) 将瞬态声明添加到域对象的顶部:

 static transients = [ 'reversedName' ] 

[编辑](我会选择1)(我会选择2);-)

在国际海事组织,2是一个更好的选择,因为它更清楚地表达了你的意图。谢谢蒂姆,两种选择都有效。还不确定我喜欢哪一个。我同意唐的看法。如果它返回一个字符串,那么就这样说。def是对象的别名,因此调用方在不阅读文档或代码的情况下不知道该对象的类型。IMO def在Groovy和Grails中被过度使用。添加瞬变列表非常简单。@Richard——如果Don和Burt都说选项2是前进的方向,我也改变了主意,选择了它:)阅读grails文档,我看到了常用的静态样式,例如静态映射等。因此,这似乎是一个不错的方法。谢谢大家的意见。
 static transients = [ 'reversedName' ]