SPRINGMVC и @CONFIGGIGURY: регистрируйте конверсионные данные и httpmessageconverter
-
22-12-2019 - |
Вопрос
Мне очень нравится весна и стиль @configuration, чтобы избавиться от конфигурации на основе XML. Я успешно использую его для слоя обслуживания и репозитория. То, что я также люблю, это функция впрыска зависимостей и утилиты JDO / JPA / JDBC!
Что я на самом деле не получаю, как работает Spring WebMvc. Для меня слишком много неконтролируемой магии. (и с @enableautoconfiguration существует еще больше магии. Хорошо для легкого прототипирования, трудно поддерживать).
Вот как я настрою свой 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/*");
}
}
.
Теперь я хочу добавить преобразователи типа и httpMessageConververs, поэтому в классе SpringWebconfigurationing я пробовал:
@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;
}
}
.
Что бы я предпочел, чтобы найти интуитивно понятную, это добавить тип и преобразователи сообщений, когда я построю сервлете диспетчера. Это было бы намного яснее, чем какое-то сомнительное творчество или создание бобов. Я всегда «надеюсь», что диспетчер сервлет внутренне набрал мою бобы, но это часто просто пробный и ошибка. Можно ли настроить весну MVC в режиме ожидания ? С менее волшебными и более конкретными призывами и #adhttttpmessageconverter (...) призывает к примеру?
То же самое в основном для исключения, запросHHandler и RequestAppter.
Ян
Решение
Самый прямой путь будет расширяться генеракодицетагкодом.Вы можете настроить почти все так, чтобы переопределить методы.
Но имейте в виду, что это очень прямой способ настроить вещи.Это дает вам гораздо больше контроля, чем у вас сейчас, или даже генеракодицетагкод даст вам.Из документов:
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
.
пользовательские (или настроенные) преобразователи сообщения могут быть добавлены путем переопределения WebMvcConfigurationSupport
.
Другие советы
Если вы продлите WebMvcconfiguralaDapter для вашей веб-конфигурации, оно должно чувствовать себя немного меньше магии, а также дать вам крюк, чтобы настроить преобразователи сообщения, а также ряд других компонентов.
@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);
}
}
.