2016-04-07 7 views
1

Ich versuche benutzerdefinierte Eigenschaftseditoren mithilfe der folgenden Konfiguration in meiner Spring-Startanwendung zu registrieren. Die folgende Dokumentation link Abschnitt 5.4.2.1.Registrierung CustomPropertyEditors für die Verwendung in BeanWrapper

@Bean 
public static CustomEditorConfigurer customEditorConfigurer() { 
    CustomEditorConfigurer configurer = new CustomEditorConfigurer(); 
    configurer.setPropertyEditorRegistrars(new PropertyEditorRegistrar[] { 
       (registry) -> registry.registerCustomEditor(Instant.class, new CustomInstantEditor()) }); 
     return configurer; 
    } 

Wenn habe ich eine BeanWrapper und dessen Verwendung ich folgende Fehler

-Code bin immer:

BeanWrapper newAccountWrapper = new BeanWrapperImpl(newAccount); 
newAccountWrapper.setPropertyValue("chardate", value); 

Fehler ist:

Exception is Failed to convert property value of type [java.lang.String] to required type [java.time.Instant] for property 'chardate'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.time.Instant] for property 'chardate': no matching editors or conversion strategy found 

Aber der obige Code funktioniert, wenn Ich registriere den CustomEditor für den BeanWrapper

BeanWrapper newAccountWrapper = new BeanWrapperImpl(newAccount); 
newAccountWrapper.registerCustomEditor(Instant.class, new 
      CustomInstantEditor()); 

Kann ich nicht customPropertyEditors mit CustomEditorConfigurer BeanFactoryPostProcessor registrieren?

Zusätzliche Information:

BeanWrapper newAccountWrapper = new BeanWrapperImpl(newAccount); 
    newAccountWrapper.registerCustomEditor(Instant.class, new CustomInstantEditor()); 
    newAccountWrapper.registerCustomEditor(Money.class, new CustomMoneyEditor()); 

    newAccountWrapper.setAutoGrowNestedPaths(true); 

    accountDomainElements.forEach((accountElement, value) -> { 
     newAccountWrapper.setPropertyValue(accountElement, value); 
+0

Nicht Geben Sie versuchen, wenn Sie die 'BeanWrapper' selbst erstellen und nicht die konfiguriert für sie gelten. Wenn Spring eine Instanz erstellt, erkennt es alle Konfiguratoren und wendet diese auf die erstellte BeanWrapper-Implementierung an. Du machst das nicht und im Grunde umgehen wir Spring in diesem. Warum erstellst du deine eigene Instanz? –

+0

Also, wenn ich einen BeanWrapper erstellen, sollte ich es explizit konfigurieren und CustomEditorConfigurer wird nicht helfen –

+0

Nein, wenn die Spring MVC Stuff erstellt eine 'BeanWrapper'-Instanz, es tut einige zusätzliche Konfiguration. Es setzt den 'ConversionService' und benutzt registrierte' PropertyEditorRegistrar' Instanzen, um zusätzliche 'PropertyEditors' hinzuzufügen. Da Sie die Instanzen selbst erstellen, umgehen Sie diese Option jedoch vollständig. Warum müssen Sie sogar Ihre eigene Instanz des 'BeanWrapper's erstellen, die Sie normalerweise nicht selbst machen. –

Antwort

0

ein

@Bean 
public CustomEditorConfigurer customEditorConfigurer() { 
    CustomEditorConfigurer configurer = new CustomEditorConfigurer(); 
    Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>(); 
    customEditors.put(Instant.class, CustomInstantEditor.class); 
    configurer.setCustomEditors(customEditors); 
    return configurer; 
} 
Verwandte Themen