Grails语言环境无关的十进制数据绑定

时间:2015-09-20 19:39:21

标签: grails data-binding

有什么问题:

在我的应用程序中,前端的数字始终以,作为小数分隔符显示。当用户更改其区域设置并使用?lang=en_EN参数编辑实体时,会出现错误绑定的问题。使用en_EN语言环境会发生什么情况,小数点分隔符为.,它会对数据库中的输入11,001100产生值,而不是11.00 - 关于金钱的关键问题。

使用的软件:

Grails 2.3.8
Groovy 2.2.1

我想做什么:

在我的情况下,转换器中的默认“语言环境感知”方法非常有问题,我希望它们以相同的方式绑定,这应该是与语言环境无关的。

我已尝试过的内容:

我发现默认情况下的作业是LocaleAwareNumberConverter,更具体地说是LocaleAwareBigDecimalConverter,所以我写了一个简单的实现,只使用一个语言环境(在本例中为GERMAN,因为它使用,作为小数分隔符)

@CompileStatic
class MyBigDecimalConverter extends LocaleAwareNumberConverter {

    @Override
    protected NumberFormat getNumberFormatter() {
        NumberFormat.getInstance(Locale.GERMAN)
    }
}

将其包含在resources.groovy

myBigDecimalConverter com.company.converters.MyBigDecimalConverter

但它不起作用。仍会使用LocaleAwareBigDecimalConverter转换值。

修改

我已将我的转换器更改为直接实现ValueConverter

@CompileStatic
class MyBigDecimalConverter implements ValueConverter {

    @Override
    boolean canConvert(Object value) {
        value instanceof String
    }

    @Override
    Object convert(Object value) {
        def numberFormatter = NumberFormat.getInstance(Locale.GERMAN)
        numberFormatter.parse((String)value).asType(getTargetType())
    }

    @Override
    Class<?> getTargetType() {
        BigDecimal
    }
}

这个转换器也没有被调用。我没有对resources.groovy

进行任何更改

1 个答案:

答案 0 :(得分:5)

好的,我想我现在已经开始工作了。它基于我的代码,但也适合你。

要为ValueConverter注册您自己的BigDecimal,您应该将defaultGrailsBigDecimalConverter(YourBigDecimalValueConverter)添加到 resources.groovy 。我从Grails 2.3.11的 DataBindingGrailsPlugin.groovy 中得出了这个结论。

如果您在 Config.groovy 中有grails.databinding.useSpringBinder = true,则需要将其删除以启用Grails 2.3的新数据绑定。

我的ValueConverter类似于您的第二个直接实现它的示例,因此请先使用该示例以尽量减少可能发生的其他问题。

这就是它的全部。我已经实现了一个ValueConverter,它接受​​点和逗号作为分隔符,然后根据用户的语言环境显示它。它工作正常,棘手的部分是找出 resources.groovy 的正确名称,同时禁用Spring绑定器。