Domanda

Mi piace molto la primavera e lo stile @configurazione per sbarazzarsi della configurazione basata su XML. L'utilizzo con successo per il livello di servizio e repository. Quello che amo anche è la funzione di iniezione di dipendenza e le utilità JDO / JPA / JDBC!

Quello che non capisco è, come funziona la molla webmvc. C'è troppa magia incontrollabile per me. (e con @enableautoconfigurazione è ancora più magia introdotta. Buono per una facile prototipazione, difficile da mantenere).

È così che configura il mio 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/*");
    }

}
.

Ora voglio aggiungere convertitori di tipo e httpmessageconverter, quindi nella classe SpringWebConfiguration ho provato:

@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;
    }
}
.

Cosa preferirei trovare intuitivo è aggiungere convertitori di tipo e messaggi quando costruisco il servlet del dispatcher. Sarebbe molto più chiaro di qualche dubbia creazione di avvitazione o fagioli. Ho sempre "speranza" che il servlet del dispatcher fisico internamente le mie fagioli, ma spesso è solo una prova e un errore. è possibile impostare la molla MVC in modo direttore ? Con meno magiche e istanze di calcestruzzo e #ADDHTTPMessageConverter (...) chiedono ad esempio?

Lo stesso fondamentalmente per l'eccezioneResolvers, richiestiHandler e RepressAdatter.

Jan

È stato utile?

Soluzione

Il modo più diretto sarebbe quello di estendere WebMvcConfigurationSupport.Puoi impostare quasi tutto in quel modo ignorando i metodi.

Ma essere consapevole del fatto che è un modo molto diretto per configurare le cose.Ti dà molto più controllo di quello che hai ora o che anche WebMvcConfigurerAdapter ti darebbe.Dai documenti:

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
.

Convertitori di messaggi personalizzati (o personalizzati) possono essere aggiunti sovrascrivendo configureMessageConverters.

Altri suggerimenti

Se si estende il Webmvcconfigureadapter per la configurazione web, dovrebbe sentire un po 'meno magia e anche darti il gancio per configurare i convertitori di messaggi e un numero di altri componenti.

    @Configuration
    @ComponentScan
    @EnableWebMvc
    public class WebConfiguration extends WebMvcConfigurerAdapter
    {
      @Autowired
      private CustomObjectMapper domainMapper;

      @Override
      public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
      {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(domainMapper);
        converters.add(converter);
        super.configureMessageConverters(converters);
      }

    }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top