SpringMVC y @Configuración:registro ConversionService y HttpMessageConverter
-
22-12-2019 - |
Pregunta
Me gusta la primavera y el @estilo de Configuración para deshacerse de basado en xml de configuración.Puedo utilizar con éxito para el servicio de repositorio y capa.Lo que también me encanta es la dependencia de la función de inyección y el JDO/JPA/Jdbc utilidades!
Lo que yo realmente no se que es, cómo la Primavera WebMVC obras.Hay demasiado incontrolable magia para mí.(y con @EnableAutoConfiguration incluso hay más magia introducido.Bueno para la fácil creación de prototipos, difícil de mantener).
Que es ¿cómo puedo configurar mi 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/*");
}
}
Ahora quiero agregar tipo de convertidores y httpMessageConverters, por lo que en el SpringWebConfiguration clase he intentado:
@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;
}
}
Lo prefiero encontrar intuitiva es agregar el tipo de mensaje y los convertidores de cuando se construyo el dispatcher servlet.Eso sería mucho más clara que la de una dudosa autowiring de soja o la creación.Yo siempre la "esperanza" de que el Dispatcher Servlet internamente fotos de mi frijoles, pero a menudo es sólo de prueba y error. Es posible configurar spring Mvc en un directer manera?Con menos magia y más en concreto los casos y #addHttpMessageConverter(...) las llamadas, por ejemplo?
Mismo, básicamente, por la ExceptionResolvers, RequestHandler y RequestAdapter.
Jan
Solución
La forma más directa sería ampliar WebMvcConfigurationSupport
.Puede configurar casi todo lo que manera de reemplazar los métodos.
Pero ser conscientes de que es una forma muy directa a la instalación de esas cosas.Que le da mucho más control que el que tienes ahora o que incluso WebMvcConfigurerAdapter
le puede dar.A partir de la documentación:
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
Personalizado (o personalizado) mensaje de convertidores pueden ser añadidos por razones imperiosas de configureMessageConverters
.
Otros consejos
Si extiende el webmvcconfigureradapter Para su configuración web, debe sentirse un poco menos magia y también le brinda el gancho para configurar sus convertidores de mensajes, así como una serie de otros componentes.
@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);
}
}