升级到Grail1.1.2的问题(1):Problem on binding one-to-many data

【问题】

view(gsp页面)上有select box,在Controller里面调用xxxInstance.properties = params时,会报错:

 

{{org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Error occurred creating command object.
....
....
Caused by: java.lang.ClassCastException: B$_clinit_closure1 cannot be cast to java.util.Map
at org.codehaus.groovy.grails.web.binding.GrailsDataBinder.getConstrainedPropertyForPropertyValue(GrailsDataBinder.java:309)

 

【临时解决办法】

Step1.升级到最新的hibernate 1.1.3-SNAPSHOT

grails install-plugin hibernate 1.1.3-SNAPSHOT

Step2. putting the following in BootStrap

private static convertToType(value, targetType) {
        SimpleTypeConverter typeConverter = new SimpleTypeConverter()

        if (value != null && !targetType.isAssignableFrom(value.class)) {
            if (value instanceof Number && Long.class.equals(targetType)) {
                value = value.toLong()
            }
            else {
                try {
                    value = typeConverter.convertIfNecessary(value, targetType)
                } catch (org.springframework.beans.TypeMismatchException e) {
                    // ignore
                };
            }
        }
        return value
    }

    def init = { servletContext ->

        //---------------------------------------------------------------------
        // FIX BUG GRAILS-5445
        //---------------------------------------------------------------------
        def ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext)
        
        if(ctx.containsBean("sessionFactory")) {
            def sf = ctx.getBean("sessionFactory")
            def template = new HibernateTemplate(sf)
            for(d in ctx.getBean("grailsApplication").domainClasses) {
                def domain = d
                def identityType = domain.identifier.type
                domain.clazz.metaClass.static.get = { Serializable id ->
                    id = convertToType(id, identityType)
                    def obj = id ? template.get(domain.clazz,id) : null
                    if(obj && obj instanceof org.hibernate.proxy.HibernateProxy) {
                        obj = obj.getHibernateLazyInitializer().implementation
                    }
                    return obj
                }
            }
        }

 如果Step1能解决问题,则不需要进行step2了。

 

【结论及其他】

1. 升级一个小版本号就引发这么大的问题,实在让人心寒,不过答复倒是挺快,临时解决方案也有了

2. 官方答复在1.1.3中修复此问题

3. 本问题Jira地址:http://jira.codehaus.org/browse/GRAILS-5445

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值