私は2日間検索して試してきました。最後に、カスタム PropertyEditorRegistar を定義することにしました。このようにして、Double フィールド形式のロケールのみを修正できます。ただし、すべての Double フィールドに適用されるため、これが最善の解決策だとは思いません。しかし、その間、それはかなりうまく機能します。したがって、誰かがより良い解決策を持っている場合は、喜んでテストしてコードを更新します。
これが私がこれを設定する方法です:
1 - PropertyEditorRegistrar を実装する新しい groovy クラスを作成します (既にある場合は、メソッドに含まれるコードの一部を既存のものに追加するだけです)。
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
public class CustomDoubleRegistrar implements PropertyEditorRegistrar {
@Override
public void registerCustomEditors(PropertyEditorRegistry registry) {
//define new Double format with hardcoded Locale.ENGLISH
registry.registerCustomEditor(Double.class,
new CustomNumberEditor(Double.class,
DecimalFormat.getInstance(Locale.ENGLISH),true))
}
}
2- カスタム レジストラを conf/spring/resources.goovy に定義します (もちろん、まだ存在しない場合)。
beans = {
customPropertyEditorRegistrar(CustomDoubleRegistrar)
}
3- 以上です。Grails の自動データ バインディングは問題なく動作します。
Test t = new Test(params);
//params contains many Double fields with dot '.' as decimal delimiter
より良い解決策を投稿することを躊躇しないでください...ありがとう
編集1
Grails 2.3 以降、このソリューションは機能しなくなりました。このソリューションを引き続き使用する場合は、この構成をConfig.groovyファイルに追加する必要があります。
grails.databinding.useSpringBinder = true
または、新しいDataBindingのいずれかを実装します。私はそれらのいくつかを試しましたが、小数点区切りの問題を解決するものは何もないようです。方法を知っている場合は、回答を投稿していただきありがとうございます...
編集2
Grails 2.4 以降では、独自の ValueConverter を定義して、基本的な Locale 検証をバイパスできます。最初の投稿と EDIT 1 で行った変更を削除する必要があることに注意してください。カスタム ValueConverter を実装する方法は次のとおりです。
conf/春/resources.groovy
// Place your Spring DSL code here
beans = {
"defaultGrailsjava.lang.DoubleConverter"(DoubleValueConverter)
}
class DoubleValueConverter implements ValueConverter {
public LongValueConverter() {
}
boolean canConvert(value) {
value instanceof Double
}
def convert(value) {
//In my case returning the same value did the trick but you can define
//custom code that takes care about comma and point delimiter...
return value
}
Class<?> getTargetType() {
return Double.class
}
}