2017-09-27 3 views
0

verwenden würde ich Converter s über FormattingConversionService hinzufügen möchten, die eine @Configuration Klasse mit WebMvcConfigurationSupport Verlängerung erfordert:Wie WebMvcConfigurationSupport aus eigenen Auto-Konfiguration

@Configuration 
public class WebAutoConfig extends WebMvcConfigurationSupport { 

    @Override 
    public FormattingConversionService mvcConversionService() { 

     FormattingConversionService fcs = super.mvcConversionService(); 

     // add Enum converter in order to accept enums 
     // case insensitively over Rest: 
     fcs.addConverter(
       String.class, 
       MyEnum.class, 
       new EnumCaseInsensitiveConverter<>(MyEnum.class) 
     ); 

     return fcs; 
    } 
} 

Es funktioniert gut, wenn die @Configuration verwendet wird direkt aus dem Projekt, aber es ist erforderlich, diese Logik zu unserem eigenen boot-starter hinzuzufügen, so dass es nicht notwendig wäre, Code in allen Projekten zu duplizieren.

Problem ist, wenn dieses @Configuration einen Starter Projekt migriert wird, dann

  • mvcConversionService() nicht ausgeführt wird, und
  • RestControllers Routing gebrochen ist (dh keine Anfragen korrekt abgebildet werden).

Wie geht man das an? Hinweis mit WebMvcConfigurationSupport ist keine harte Anforderung. Wie aus dem Codeausschnitt ersichtlich, besteht das Endziel darin, bestimmte Aufzählungen so zu konfigurieren, dass sie von den übrigen Controllern case-insensitiv akzeptiert werden.

bearbeiten: hinzugefügt, dass das Auto-Config-Projekt eingerichtet ist richtig sein soll, wie andere @Configuration Klassen im selben Paket wie WebAutoConfig.java Ausführung werden. Denken Sie, dass das Problem damit zu tun hat, wie Konfigurationsklassen, die WebMvcConfigurationSupport (oder WebMvcConfigurerAdapter für diese Angelegenheit) erweitern, von Auto-Configs gehandhabt werden.

EDIT2: Nur so habe ich es geschafft, so weit zu kommen zu arbeiten, ist die Config-Klasse aus dem mit Projekt erstreckt:

import myautoconfproject.autoconfigure.WebAutoConfiguration; 

@Configuration 
public class WebConfiguration extends WebAutoConfiguration { 
} 

Aber das ist nicht wirklich Auto-Konfiguration mehr.

+0

Was die Einrichtung Ihres Starter Es gibt keine wirkliche schwarze Magie Ihren eigenen Starter, andere als condit zur Umsetzung ionales Laden davon. Sind Sie sicher, dass die Konfiguration von Ihrem Starter gescannt werden würde? –

+0

@DarrenForsythe Ja, es ist sicher aufgenommen, da der Autokonfig-Einstiegspunkt '@ ComponentScan' enthält. Außerdem gibt es andere '@ Configuration'-Klassen in demselben Paket, die ausgeführt werden. – laur

Antwort

0

Offenbar war ich falsch über die WebMvcConfigurerAdapter - dass man oben durch auto-config gerichtet:

@Configuration 
public class WebAutoConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addFormatters(final FormatterRegistry registry) { 

     registry.addConverter(
       String.class, 
       MyEnum.class, 
       new EnumCaseInsensitiveConverter<>(MyEnum.class) 
     ); 
    } 
} 
0

Damit Ihre Konfiguration für Projekte automatisch aufgenommen werden, die das Projekt als Abhängigkeit enthalten, müssen Sie die Datei META-INF/spring.factories zu Ihrem Classpath hinzufügen (in dem Projekt, bei dem WebAutoConfig liegt und fügen Sie die Zeilen

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
your.package.WebAutoConfig 
+0

Das ist nicht das Problem. Der EnableAutoConfiguration-Einstiegspunkt ist bereits in 'spring.factories' festgelegt und verweist auf eine andere Klasse im autoconfig-Projekt, die' @ ComponentScan' enthält und auf andere '@Configuration'-Klassen verweist, einschließlich der' WebAutoConfig'. Siehe meinen Kommentar unter der Frage. Das Problem, soweit ich das beurteilen kann, scheint zu sein, wie 'WebMvcConfiguratorAdapter' von autoconfig verwendet werden kann/kann. – laur

Verwandte Themen