我正在开发一个简单的购物车应用程序,它需要能够在URL中传递特定产品的数量。我设想通过在命令对象上设置map属性来保持数据绑定的简单性。但是,当我使用期望被放入映射的参数执行操作时,我会得到以下错误:
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)命令对象如下所示:
class MyCommand {
Map itemQty
static constraints = {
itemQty(nullable: true, blank: true)
}
}控制器操作如下所示:
def action = {MyCommand myCommand ->
// some code
}我正在点击的一个例子是/mygrailsapp/action?itemQty123=5
我遵循Grails的例子将数据绑定到地图上,唯一的区别是我试图从URL而不是post (如docs )这样做。我正在使用Grails 1.3.7。我尝试过对括号进行编码,但是我得到了同样的错误。
任何帮助都将不胜感激。谢谢!
编辑:我发现这是因为spring希望映射在设置值之前有键,并且不会插入新条目。
我现在尝试使用自定义绑定来填充映射,但是属性编辑器类方法从未被调用。
下面是我的属性编辑器(我调用Super以验证控件是否到达了该方法):
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()
}
}以下是书记官长:
class ItemQuantityPropertyEditorRegistrar implements PropertyEditorRegistrar {
void registerCustomEditors(PropertyEditorRegistry propertyEditorRegistry) {
propertyEditorRegistry.registerCustomEditor(MyCommand, "itemQty", new ItemQuantityPropertyEditor())
}
}以下是我在resources.groovy中的条目:
beans = {
itemQuantityPropertyEditorRegistrar(ItemQuantityPropertyEditorRegistrar)
}发布于 2011-05-05 16:15:08
尝试使用公用集合来初始化Map,延迟映射:
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的东西..。
https://stackoverflow.com/questions/5720737
复制相似问题