2016-09-13 2 views
0

ich habe folgendes Problem genannt:Benutzerdefinierte Enum Converter ist instanziiert wird aber nicht

Ein Teammitglied geändert Sensa/ext js Frontend und einen Parmeter mit einem Raum statt einem Unterstrich zu senden. Ich weiß nicht, den Front-End-Code des Projektes als auch, und dies verursacht den folgenden Fehler:

Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.web.bind.annotation.RequestParam org.company.project.persistence.enums.DocumentTypeEnum for value 'EXPERT OPINION'; nested exception is java.lang.IllegalArgumentException: No enum constant org.company.project.persistence.enums.DocumentTypeEnum.EXPERT OPINION 

ich einen get Parameter der Anforderung geändert Fiedler mit, und ich sah, dass das Problem ist, dass EXPERT OPINION wird anstelle von EXPERT_OPINION gesendet.

Zunächst habe ich eine filter hinzugefügt und versucht, den Parameterwert zu ändern, aber ich musste einen Wrapper hinzufügen, da Sie HTTP-Anfragen nicht direkt ändern können. Der zugrundeliegende Konverter scheint jedoch den parameter-Wert direkt von der ursprünglichen http-Anforderung zu erhalten, daher ist dies fehlgeschlagen.

Dann entschied ich mich, einen benutzerdefinierten Konverter zu machen. Ich habe die folgende Klasse gemacht, die instanziiert wird, wenn ich das Projekt laufen, aber es wird nie die spezifische Umwandlung durchzuführen genannt:

@Configuration 
public class EnumCustomConversionConfiguration { 

    @Bean 
    public ConversionService getConversionService() { 
     ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean(); 
     bean.setConverters(getConverters()); 
     bean.afterPropertiesSet(); 
     ConversionService object = bean.getObject(); 
     return object; 
    } 

    private Set<Converter> getConverters() { 
     Set<Converter> converters = new HashSet<Converter>(); 

     converters.add(new StringToEnumConverter(DocumentTypeEnum.class)); 

     return converters; 
    } 

    @SuppressWarnings("rawtypes") 
    private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> { 

     private final Class<T> enumType; 

     public StringToEnumConverter(Class<T> enumType) { 

      this.enumType = enumType; 
     } 

     @SuppressWarnings("unchecked") 
     public T convert(String source) { 

      checkArg(source); 
      return (T) Enum.valueOf(enumType, source.trim()); 
     } 

     private void checkArg(String source) { 

      // In the spec, null input is not allowed 
      if (source == null) { 
       throw new IllegalArgumentException("null source is in allowed"); 
      } 
     } 
    } 

} 
+1

Zuerst könnte es eine gute Idee sein, Ihren benutzerdefinierten Konverter zu den vorhandenen hinzuzufügen und sie nicht durch Ihren zu ersetzen. Woher weißt du, dass es nicht heißt? Ist diese Konfiguration irgendwie "deklariert" (d. H. Weiß der Frühling davon)? Sind Sie sicher, dass Ihr Konverter Platz durch '_' ersetzt? Kannst du nicht den Front-End-Kerl bitten, sein Durcheinander zu reparieren? –

+1

Siehe auch diese Frage: http://stackoverflow.com/questions/11273443/how-to-configure-spring-conversionservice-with-java-config (das könnte dein Problem sein) –

+0

@RC Ich setze Breakpoints innerhalb der 'konvertieren 'Methode. Die Methode org.springframework.core.convert.support.StringToEnum.convert wird aufgerufen, das ist die Standard-Spring-One ... aber nicht meine eigene, um den Hack einzuführen. Ich habe mit Back-End-Jungs gesprochen und es stellt sich heraus, dass ich den Front-End-JS-Code neu erstellen muss. Das ärgert mich aber immer noch ... Warum wird nicht meine eigene Convert-Methode für den spezifischen Enum-Typ aufgerufen? –

Antwort

0

Haben Sie fügen Sie Ihre Spring MVC-Konfiguration?

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "..." }) 
public class ApplicationConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addFormatters(FormatterRegistry formatterRegistry) { 
     formatterRegistry.addConverter(getMyConverter()); 
    } 

... 
Verwandte Themen