Frage

Ich mag spring und den @Configuration-Stil sehr, um die xml-basierte Konfiguration loszuwerden.Ich benutze es erfolgreich für die Service- und Repository-Schicht.Was ich auch liebe, ist die Abhängigkeitsinjektionsfunktion und die JDO / JPA / Jdbc-Dienstprogramme!

Was ich nicht wirklich verstehe, ist, wie das Spring WebMVC funktioniert.Es gibt zu viel unkontrollierbare Magie für mich.(und mit @EnableAutoConfiguration wird noch mehr Magie eingeführt.Gut für einfaches Prototyping, schwer zu warten).

So konfiguriere ich meine Webapp:

public class SpringWebBooter implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext();
        rootContext.register(SpringConfiguration.class); //main configuration class for all beans
        rootContext.refresh();

        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.setParent(rootContext);
        ctx.register(SpringWebConfiguration.class); //web context configuration class

        ServletRegistration.Dynamic api = servletContext.addServlet("api", new DispatcherServlet(ctx));
        api.setLoadOnStartup(1);
        api.addMapping("/api/*");
    }

}

Jetzt möchte ich Typkonverter und HttpMessageConverter hinzufügen, also habe ich es in der SpringWebConfiguration-Klasse versucht:

@EnableWebMvc
@Configuration
@ComponentScan
public class SpringWebConfiguration {

    //works but feels very *magic*
    @Autowired
    public void configureConversionService(FormattingConversionService conversionService) {
        conversionService.addConverter(new PointConverter(GEOMETRY_FACTORY));
        conversionService.addConverterFactory(new StringToEnumConverterFactory());
    }

    //not working yet
    @Bean
    public MappingJackson2HttpMessageConverter createJsonMessageConverter() {
        ObjectMapper o = new ObjectMapper();
        o.enable(SerializationFeature.INDENT_OUTPUT);
        MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
        c.setObjectMapper(o);
        return c;
    }
}

Was ich lieber intuitiv finde, ist das Hinzufügen von Typ- und Nachrichtenkonvertern, wenn ich das Dispatcher-Servlet erstelle.Das wäre viel klarer als irgendeine zweifelhafte Autoverdrahtung oder Bohnenkreation.Ich "hoffe" immer, dass das Dispatcher-Servlet intern meine Bohnen aufzeichnet, aber es ist oft nur Versuch und Irrtum. Ist es möglich, Spring Mvc direkt einzurichten?Mit weniger Magie und konkreteren Instanziierungen und #addHttpMessageConverter(...) anrufe zum Beispiel?

Gleiches gilt grundsätzlich für die Exceptionresolver, RequestHandler und RequestAdapter.

Jan

War es hilfreich?

Lösung

Der direkteste Weg wäre zu verlängern WebMvcConfigurationSupport.Sie können fast alles auf diese Weise einrichten, indem Sie die Methoden überschreiben.

Aber sei dir bewusst, dass es ein sehr direkter Weg ist, Dinge einzurichten.Es gibt Ihnen viel mehr Kontrolle als Sie jetzt haben oder sogar WebMvcConfigurerAdapter würde dir geben.Aus den Dokumenten:

If the customization options of {@link WebMvcConfigurer} do not expose
something you need to configure, consider removing the {@code @EnableWebMvc}
annotation and extending directly from {@link WebMvcConfigurationSupport}
overriding selected {@code @Bean} methods

Benutzerdefinierte (oder angepasste) Nachrichtenkonverter können durch Überschreiben hinzugefügt werden configureMessageConverters.

Andere Tipps

Wenn Sie das webmvcconFigurerArter Für Ihre Webkonfiguration sollte es sich um ein wenig weniger Magie anfühlen und Ihnen auch den Haken geben, um Ihre Nachrichtenwandler sowie eine Reihe anderer Komponenten zu konfigurieren.

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top