首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从URL到Map属性的Grails数据库。自定义数据绑定永远不会被调用。

从URL到Map属性的Grails数据库。自定义数据绑定永远不会被调用。
EN

Stack Overflow用户
提问于 2011-04-19 18:11:49
回答 1查看 1.3K关注 0票数 2

我正在开发一个简单的购物车应用程序,它需要能够在URL中传递特定产品的数量。我设想通过在命令对象上设置map属性来保持数据绑定的简单性。但是,当我使用期望被放入映射的参数执行操作时,我会得到以下错误:

代码语言:javascript
复制
ERROR errors.GrailsExceptionResolver  - Exception occurred when processing request: [GET] /mygrailsapp/action
itemQty[123].id: 5
java.lang.NullPointerException
    at grails.plugin.springcache.web.GrailsFragmentCachingFilter.doFilter(GrailsFragmentCachingFilter.groovy:66)
    at net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:86)
    at com.infusionsoft.cam.security.filter.BlackListIpAddressFilter.doFilter(BlackListIpAddressFilter.java:78)
    at java.lang.Thread.run(Thread.java:662)

命令对象如下所示:

代码语言:javascript
复制
class MyCommand {
    Map itemQty

    static constraints = {
        itemQty(nullable: true, blank: true)
    }
}

控制器操作如下所示:

代码语言:javascript
复制
def action = {MyCommand myCommand ->
    // some code
}

我正在点击的一个例子是/mygrailsapp/action?itemQty123=5

我遵循Grails的例子将数据绑定到地图上,唯一的区别是我试图从URL而不是post (如docs )这样做。我正在使用Grails 1.3.7。我尝试过对括号进行编码,但是我得到了同样的错误。

任何帮助都将不胜感激。谢谢!

编辑:我发现这是因为spring希望映射在设置值之前有键,并且不会插入新条目。

我现在尝试使用自定义绑定来填充映射,但是属性编辑器类方法从未被调用。

下面是我的属性编辑器(我调用Super以验证控件是否到达了该方法):

代码语言:javascript
复制
class ItemQuantityPropertyEditor extends PropertyEditorSupport {

    @Override
    public void setValue(Object value) {
        super.setValue(value)
    }

    @Override
    void setAsText(String text) {
        super.setAsText(text)
    }

    @Override
    Object getValue() {
        return super.getValue()
    }

    @Override
    String getAsText() {
        return super.getAsText()
    }

}

以下是书记官长:

代码语言:javascript
复制
class ItemQuantityPropertyEditorRegistrar implements PropertyEditorRegistrar {

    void registerCustomEditors(PropertyEditorRegistry propertyEditorRegistry) {
        propertyEditorRegistry.registerCustomEditor(MyCommand, "itemQty", new ItemQuantityPropertyEditor())
    }
}

以下是我在resources.groovy中的条目:

代码语言:javascript
复制
beans = {
    itemQuantityPropertyEditorRegistrar(ItemQuantityPropertyEditorRegistrar)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-05 16:15:08

尝试使用公用集合来初始化Map,延迟映射:

代码语言:javascript
复制
import org.apache.commons.collections.MapUtils
import org.apache.commons.collections.FactoryUtils

class MyCommand {
    Map itemQty = MapUtils.lazyMap([:], FactoryUtils.constantFactory(''))

    static constraints = {
        itemQty(nullable: true, blank: true)
    }
}

你不应该需要自定义绑定PropertyEditor的东西..。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5720737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档