如何覆盖Grails'默认(绑定)将逗号参数值转换为String数组?

时间:2014-05-13 03:30:23

标签: grails data-binding grails-2.3

我使用Grails 2.3.7并且有一个控制器方法将请求绑定到命令类。命令类中的一个字段是String数组,因为它需要指定多个具有相同名称的参数 - 例如?foo=1&foo=2&foo=3&bar=0

大部分时间都可以正常使用。它失败的一种情况是如果param值包含逗号 - 例如?foo=val1,val2&foo=val3,val4。在这种情况下,我得到一个包含4个值的数组:["val1","val2","val3","val4"],而不是["val1,val2","val1,val2"]的预期输出。 URL转义/编码逗号没有帮助,在我的情况下,参数值也被引号字符包围(foo=%22a+string+with+commas,+etc%22)。

我遇到了与Spring 3.x类似的问题,我能够解决这个问题:How to prevent parameter binding from interpreting commas in Spring 3.0.5?。我通过向控制器添加以下方法尝试了其中一个答案:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor(null));
}

然而,这并没有奏效。

我还尝试根据https://jira.grails.org/browse/GRAILS-8997中的评论指定自定义转化服务。

配置/弹簧/ resources.groovy:

beans = {
    conversionService (org.springframework.context.support.ConversionServiceFactoryBean) {
        converters = [new CustomStringToArrayConverter()]
    }
}

import org.springframework.core.convert.converter.Converter
import org.springframework.util.StringUtils

class CustomStringToArrayConverter implements Converter<String, String[]> {
    @Override
    public String[] convert(String source) {
        return StringUtils.delimitedListToStringArray(source, ";");
    }
}

但我也无法让它发挥作用。

1 个答案:

答案 0 :(得分:0)

现在,我想出了一个解决方法。我的Controller方法有一个额外的行来明确设置麻烦的字段:

commandObj.foo = params.list('foo') as String[]

我仍然愿意接受有关如何将逗号配置为以逗号分割的建议...