使用ValueConverter绑定命令对象

时间:2014-08-07 13:35:01

标签: grails data-binding

在我的Grails 2.3.7应用程序中,我有以下命令对象

class UpdateThresholdsCommand {
    Double threshold_1
    Double threshold_2
}

我试图绑定到这些属性的参数是格式化的货币值,例如threshold_1=$2,459.04&threshold_2=$1,459.04

我已经定义了ValueConverter的以下实现来执行此绑定

class CurrencyStringToDoubleConverter implements ValueConverter {

    FormatService formatService

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

    @Override
    Object convert(Object value) {
        formatService.parseCurrency((String) value)
    }

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

并在resources.groovy

中注册
currencyStringToDoubleConverter(CurrencyStringToDoubleConverter) {
    formatService = ref('formatService')
}

但是,如果将带有上述params的请求发送到操作,则永远不会调用CurrencyStringToDoubleConverter,因此命令对象的threshold_1threshold_2属性为null。为什么不调用CurrencyStringToDoubleConverter

2 个答案:

答案 0 :(得分:2)

您描述的方法确实有效。在https://github.com/jeffbrown/donalconverter查看应用。运行该应用程序并单击主索引页面上的链接。 FormatService被硬编码以返回21.12(请参阅https://github.com/jeffbrown/donalconverter/blob/7a01031deceeea0d857af23f58686b4f1f824e1d/grails-app/services/demo/FormatService.groovy#L7),但该应用程序证明正在调用转换器并且转换器正在委托给该服务。

您尚未显示FormatService正在做什么。可能是该代码中存在错误并且抛出异常,在这种情况下,您的命令对象应该具有与之关联的相应绑定错误。

如果没有看到您的代码或看到任何相关错误,很难说出现了什么问题,但链接的应用程序应该证明转换器正在被调用,至少在那个应用程序中。

应用中的相关文件:

我希望有所帮助。

答案 1 :(得分:0)

如果有人在这里找到了他们的方法,您可能需要将此注释放在您的转换器上,以使其比内置的 Grails 转换器具有更高的优先级:

import org.springframework.core.annotation.Order
import org.springframework.core.Ordered

@Order(value=Ordered.HIGHEST_PRECEDENCE)
class DateTimeValueConverter implements ValueConverter  {
    // blah blah
}