2

在我的应用程序中,许多类都有共同的字段“公司”。当应用程序保存该对象时,它们必须填写公司(对此进行验证)。公司也保持在一个会话中。现在,当我想使用域类作为命令对象时,必须已经填写公司,否则我会收到验证错误。在进行任何验证之前,有什么方法可以始终填写公司字段,这样我就不必每次都手动进行。(我试过自定义数据绑定器,但是当请求中没有参数时它不起作用)

4

2 回答 2

1

您可以在对象被保存、更新或验证之前使用GORM events beforeInsert或.beforeUpdatebeforeValidate

在您的域中,您需要类似的东西:

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 回答