SPRINGMVC и @CONFIGGIGURY: регистрируйте конверсионные данные и httpmessageconverter

StackOverflow https://stackoverflow.com//questions/21049617

Вопрос

Мне очень нравится весна и стиль @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);
      }

    }
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top