SpringMvc e @Configuration: registrati conversionservice e httpmessageconverter
-
22-12-2019 - |
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
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);
}
}
.