我正在使用带有Grails 2.3.9的Dojo 1.9.
Dojo NumberTextBox小部件 – 我在表单中使用 – 将固定格式(JavaScript基本格式)的实数值(例如:12.56)设置为HTML表单输入字段(但根据浏览器区域设置显示/编辑它们,所以用户总是看到格式正确的数字).
另一方面,Grails期望输入字段根据浏览器区域设置进行格式化.
这会导致转换不匹配,并且当浏览器区域设置不是英语时Grails会丢失小数位并将记录错误地保存到数据库中.
我试图通过实现自定义ValueConverter并在应用程序上下文中注册它来覆盖Grails中的值转换.
浏览器发送的请求正确包含实际值(“12.45”)
主要问题是我的转换器似乎根本没用过.
如何注册它以覆盖defaut Double数据转换?
转换器:
package gefc.dojo.binding
import org.grails.databinding.converters.ValueConverter
import java.text.NumberFormat
/**
* Converter which allows that the doubles arrive
*/
class DojoDoubleValueConverter implements ValueConverter {
NumberFormat fmt
DojoDoubleValueConverter() {
// The number format sent by Dojo components
// English locale for the decimal separator
fmt = NumberFormat.getInstance(Locale.ENGLISH);
// no grouping
fmt.setGroupingUsed(false);
}
boolean canConvert(value) { value instanceof String }
def convert(value) {
Number n = fmt.parse(value)
return n.doubleValue()
}
Class<?> getTargetType() {
return Double.class
}
}
我在应用程序上下文中注册(resources.groovy)
beans = {
// Dojo components send real values in a fixed, ISO format, while Grails
// expects them to be formatted according to client/browser locale
// So we need to override real value conversions
doubleConverter gefc.dojo.binding.DojoDoubleValueConverter
}
解决方法:
此问题已在Grails 2.4中修复
我使用Grails 2.3.8与Long和Integer转换器有类似的问题. Grails正在使用LocaleAwareNumberConverter,它将“123abc”之类的字符串转换为“123”.
所以我定义了自己的转换器并覆盖了resources.groovy中的bean定义
beans = {
"defaultGrailsjava.lang.LongConverter"(LongValueConverter)
"defaultGrailsjava.lang.IntegerConverter"(IntegerValueConverter)
}
class LongValueConverter implements ValueConverter {
public LongValueConverter() {
}
boolean canConvert(value) {
value instanceof String
}
def convert(value) {
return value?.toLong()
}
Class<?> getTargetType() {
return Long.class
}
}
原文地址:https://codeday.me/bug/20190612/1225262.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。