Groovy / Grails验证和hasFieldErrors问题

时间:2010-03-06 23:44:22

标签: spring grails groovy tags

我创建了一个如下所示的自定义标记:

def textField = { attrs ->
    def field = attrs.name.split('\\.')[-1]
    log.error("--------- Field is ${field}")
    if (attrs.bean && attrs.bean.errors.hasFieldErrors(field)) {
        def className = attrs.remove('class')
        def classStr = 'errors '
        if (className) {
            classStr += className
        }
        attrs.put('class', classStr)
        attrs.put('value', attrs.bean[field])
        attrs.remove('bean')
    }
    out << g.textField(attrs)
}

我在我的GSP中称它为:

<my:textField bean="${client}" name="client.firstName"/>
<my:textField bean="${client}" name="client.lastName"/>
...
<my:textField bean="${client}" name="client.workPhone"/>

这是我的域级

class Client {

    String email
    String address
    String city
    String state
    String zip
    String firstName
    String lastName
    String phone
    String workPhone
    String mobilePhone
    String birthCountry
    String citizenshipCountry
    String emergencyContactName
    String emergencyPhone
    String disabilities
    String experience

    static constraints = {
        email(email:true, unique:true, blank:false)
        address(blank:false)
        city(blank:false)
        state(blank:false)
        zip(blank:false)
        firstName(blank:false)
        lastName(blank:false)
        phone(blank:false)
        emergencyContactName(blank:false)
        emergencyPhone(blank:false)

        workPhone(blank:true, nullable:true)
        mobilePhone(blank:true, nullable:true)
        birthCountry(blank:true, nullable:true)
        citizenshipCountry(blank:true, nullable:true)
        disabilities(blank:true, nullable:true)
        experience(blank:true, nullable:true)
    }

    static mapping = {
        disabilities type: 'text'
        experience type: 'text'
    }

    static hasMany = [courses:ClientCourseMap]
}

页面加载正常,除非我实际上有一个“客户端”bean。它一直加载到最后一个标签“client.workPhone”。然后我得到以下异常:

  

2010-03-06 18:32:35,329 [http-8080-2]错误view.GroovyPageView - 处理GroovyPageView时出错:执行标记时出错:org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException:Error执行标签:groovy.lang.MissingPropertyException:没有这样的属性:类的客户端:com.personal.Client atUsers/dean/Projects/PersonalGrails/grails-app/views/registration/index.gsp :98在/Users/dean/Projects/PersonalGrails/grails-app/views/registration/index.gsp:145

问题是在bean上调用hasFieldErrors时。它传入“field”,应该是“workPhone”。单步执行调试器会显示该字段正好是“workPhone”。但是,通过对字段变量的进一步检查,它显示字段的内部值为“client.workPhone”,offset = 7,count = 9,hash = 0.但是,如果调用toString(),则返回“ workPhone“如你所料。

我想知道Grails或者甚至Spring没有正确使用这个字符串?看起来它正在尝试使用该字符串的 real 值,而不是关注该字符串的偏移/计数并返回预期的内容。

有人看到我做错了吗?或者你知道一个解决方法吗?我可以提供所需的任何信息,只要问......这让我疯了!

1 个答案:

答案 0 :(得分:1)

看起来您的标记的意图是减少渲染表单时所需的样板GSP代码的数量。您是否考虑过使用bean-fields插件?