Конфигурирование автоматической сериализации мультикарты Guava с Spring Boot, когда SpringBootApplication побуждает `WebMvcConfigurer` - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть следующее SpringBootApplication:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
@Configuration
public class RestServer implements WebMvcConfigurer {
  public static void main(String[] args) {
    SpringApplication.run(RestServer.class, args);
  }
}

И я бы хотел, чтобы Multimap Guava автоматически сериализовался в JSON.

Так что у меня есть этот код в одном из моих классовгде все остальные поля успешно сериализованы в JSON:

@JsonProperty("multimap_test")
public Multimap<Instrument, AdjustedLimitOrder> getMultimap() {
  return someMultiMap;
}

Но возвращенное поле JSON выглядит так:

"multimap_test": {
  "empty": false
}

Нужно ли указывать десериализатор в поле?

Использование этого не работает, потому что нет конструктора по умолчанию:

@JsonProperty("multimap_test")
public Multimap<Instrument, AdjustedLimitOrder> getMultimap() {
  return someMultimap;
}

Обратите внимание, что мой пример реализует WebMvcConfigurer.

Здесьсписок ссылок инструкций, которые не кажутся убедительными в том, как это сделать, потому что они обсуждают случай, когда SpringBootApplication реализует SpringBootServletInitializer или WebMvcConfigurerAdapter (что устарело).

Как может Multimap Guava автоматически сериализоваться?

1 Ответ

0 голосов
/ 01 февраля 2019

Автоконфигурация MVC с пружинной загрузкой уже настраивает использование Джексона для ввода / вывода JSON, если Джексон найден в classpath.Но сконфигурированный Jackson по умолчанию не будет поддерживать Guava Multimap, вам необходимо зарегистрировать GuavaModule в Jackson ObjectMapper для его поддержки (см. docs ).

FromJacksonAutoConfiguration документы , он автоматически зарегистрирует GuavaModule в ObjectMapper, если мы объявим его как bean-компонент.Поэтому для сериализации / десериализации Multimap необходимо

  1. Добавить модуль Guava Джексона в pom.xml:

     <dependency>
       <groupId>com.fasterxml.jackson.datatype</groupId>
       <artifactId>jackson-datatype-guava</artifactId>
     </dependency>
    
  2. Объявите бин GuavaModule в @SpringBootApplication:

      @Bean
      public Module guavaModule() {
          return new GuavaModule();
      }
    

И это сделано.WebMvcConfigurer / WebMvcConfigurerAdapter предназначен для настройки параметров MVC с пружинной загрузкой по умолчанию.Вам не нужно настраивать его для своего случая, поскольку Spring MVC уже работает с Джексоном для ввода / вывода JSON из коробки.Что вам нужно сделать, это настроить Джексона, но не настроить пружинную загрузку MVC.Таким образом, не имеет значения, реализует ли SpringBootApplication или нет WebMvcConfigurer / WebMvcConfigurerAdapter, если вы просто хотите автоматически сериализовать Multimap.

...