Ho cercato e provato per 2 giorni. Finalmente ho scelto di definire un PropertyEditorRegistar personalizzato. In questo modo, posso correggere le impostazioni internazionali solo per il formato di campo doppio. Tuttavia, non penso che sia la soluzione migliore perché verrà applicata a tutti i miei campi Double. Ma nel frattempo fa il lavoro abbastanza bene. Quindi, se qualcuno ha una soluzione migliore, sarò lieto di testarlo e aggiornare il mio codice.
Quindi questo è come ho impostato questa funzione:
1 - Creare una nuova classe Groovy che implementa PropertyEditorRegistrar (se ne avete già uno, basta aggiungere la parte di codice contenuto con il metodo in quella esistente)
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- Definire il registrar personalizzato nella conf/primavera/resources.goovy (se non è già presente naturalmente)
beans = {
customPropertyEditorRegistrar(CustomDoubleRegistrar)
}
3- Questo è tutto, il Grai ls dati auto vincolante funzionerà benissimo
Test t = new Test(params);
//params contains many Double fields with dot '.' as decimal delimiter
Non esitare a pubblicare soluzioni migliori ... Grazie
EDIT 1
Dal Grails 2.3 questa soluzione non funziona più. Se si desidera continuare a utilizzare questa soluzione, si deve aggiungere questa configurazione al file diConfig.groovy
grails.databinding.useSpringBinder = true
o implementare uno dei nuovi DataBinding. Ho provato alcuni di loro ma nulla sembra risolvere il problema del delimitatore decimale. Grazie per inviare una risposta se sai come ...
EDIT 2
Dal Grails 2.4+ è possibile definire il proprio ValueConverter di bypassare la convalida di base Locale. Si noti che è necessario rimuovere le modifiche apportate nel post iniziale e nel MODIFICA 1. Ecco come implementare l'ValueConverter personalizzato:
conf/primavera/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
}
}
funziona! :), Grazie mille! – conca
sto lavorando con Grails 3.3.1 e questa soluzione non funziona per i miei oggetti comando. anche @BingUsing non funziona. Non so perché cambiano il vecchio comportamento. il nuovo è disgustoso: / – pebbles