在我的应用程序中,许多类都有共同的字段“公司”。当应用程序保存该对象时,它们必须填写公司(对此进行验证)。公司也保持在一个会话中。现在,当我想使用域类作为命令对象时,必须已经填写公司,否则我会收到验证错误。在进行任何验证之前,有什么方法可以始终填写公司字段,这样我就不必每次都手动进行。(我试过自定义数据绑定器,但是当请求中没有参数时它不起作用)
问问题
856 次
2 回答
1
您可以在对象被保存、更新或验证之前使用GORM events beforeInsert
或.beforeUpdate
beforeValidate
在您的域中,您需要类似的东西:
import org.springframework.web.context.request.RequestContextHolder
class Foo {
String company
...
def beforeInsert = {
try {
// add some more error checking (i.e. if there is is no request)
def session = RequestContextHolder.currentRequestAttributes().getSession()
if(session) {
this.company = session.company
}
} catch(Exception e) {
log.error e
}
}
}
于 2012-05-31T09:41:03.933 回答
1
如果您想在绑定过程之前绑定一个属性,您可以创建一个自定义的BindEventListener并在grails-app/conf/spring/resources.groovy中注册
首先,创建您的自定义 BindEventListener
/src/groovy/SessionBinderEventListener.groovy
import org.springframework.beans.MutablePropertyValues
import org.springframework.beans.TypeConverter
class SessionBinderEventListener implements BindEVentListener {
void doBind(Object wrapper, MutablePropertyValues mpv, TypeConverter converter) {
def session = RequestContextHolder.currentRequestAttributes().getSession()
mpv.addPropertyValue("company", session.company)
}
}
其次,注册您的 BindEventListener
grails-app/conf/spring/resources.groovy
beans = {
sessionBinderEventListener(SessionBinderEventListener)
}
但是,如果您的域类不包含名为 company 的属性,您将获得InvalidPropertyException。要克服这个问题,请创建一个包含名为company的属性的类列表- 请参阅下面的详细信息
/src/groovy/SessionBinderEventListener.groovy
import org.springframework.beans.MutablePropertyValues
import org.springframework.beans.TypeConverter
class SessionBinderEventListener implements BindEVentListener {
private List<Class> allowedClasses = [Foo]
void doBind(Object wrapper, MutablePropertyValues mpv, TypeConverter converter) {
if(!(allowedClasses.contains(wrapper.class))) {
return
}
def session = RequestContextHolder.currentRequestAttributes().getSession()
mpv.addPropertyValue("company", session.company)
}
}
于 2012-11-24T04:19:34.943 回答