在我的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_1
和threshold_2
属性为null。为什么不调用CurrencyStringToDoubleConverter
?
答案 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
}