【问题标题】:binding a command object with ValueConverter将命令对象与 ValueConverter 绑定
【发布时间】:2014-08-07 13:35:01
【问题描述】:

在我的 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')
}

但是当带有如上所示参数的请求被发送到操作时,CurrencyStringToDoubleConverter 永远不会被调用,因此命令对象的threshold_1threshold_2 属性为空。为什么没有调用CurrencyStringToDoubleConverter

【问题讨论】:

  • 您还没有将grails.databinding.useSpringBinder 设置为true 吗? Spring binder 不使用 ValueConverter beans。
  • @JeffScottBrown 不,我正在使用新的 grails binder
  • 确实很神秘。我的第一个猜测是您的转换器或服务可能引发了异常,但在第二次阅读您的描述时,“从未调用 CurrencyStringToDoubleConverter”告诉我事实并非如此。

标签: grails data-binding


【解决方案1】:

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

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

如果不查看您的代码或查看任何相关错误,很难说出问题所在,但链接的应用程序应证明正在调用转换器,至少在该应用程序中。

应用中的相关文件:

希望对你有帮助。

【讨论】:

  • 非常感谢您的回复。我会进一步调查,如果我仍然怀疑 Grails 的数据绑定存在很大问题,我会在 GitHub 上放置一个演示应用程序来隔离问题
  • 如果您可以分享一个演示问题的项目,那么我们可以解决它。
  • 这里的描述中没有包含一些相关细节,因为我创建的用于尝试重新创建问题的应用程序说明了您描述的所有细节,并且它有效。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2011-08-06
    • 2011-10-15
    • 2013-06-18
    • 2011-09-24
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多