在我的申请中,许多课程都有共同的“公司”字段。当应用程序保存该对象时,它们必须由公司填充(有验证)。公司也在会议期间。现在,当我想使用域类作为命令对象时,公司必须已经填充或者我得到验证错误。有没有办法在任何验证发生之前总是填写公司字段,这样我每次都不必手动完成。 (我尝试过自定义数据绑定器,但是当请求中没有参数时它不起作用)
答案 0 :(得分: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
}
}
}
答案 1 :(得分:1)
如果要在绑定过程之前绑定属性,可以创建自定义BindEventListener并在 grails-app / conf / spring / resources中注册。常规
首先,创建自定义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 /弹簧/ 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)
}
}