Grails,使用session中的值注入/填充域对象

时间:2012-05-31 07:15:28

标签: data-binding grails

在我的申请中,许多课程都有共同的“公司”字段。当应用程序保存该对象时,它们必须由公司填充(有验证)。公司也在会议期间。现在,当我想使用域类作为命令对象时,公司必须已经填充或者我得到验证错误。有没有办法在任何验证发生之前总是填写公司字段,这样我每次都不必手动完成。 (我尝试过自定义数据绑定器,但是当请求中没有参数时它不起作用)

2 个答案:

答案 0 :(得分:1)

您可以在使用GORM events beforeInsertbeforeUpdatebeforeValidate保存,更新或验证对象之前设置属性。

在您的域中,您需要类似的内容:

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)
    }

}