Где и когда Spring использует bean-компонент Jackson2ObjectMapperBuilderCustomizer, определенный в конфигурации проекта? - PullRequest
0 голосов
/ 04 марта 2020

Мой главный вопрос: где / когда Spring использует (внедряет) bean-компонент Jackson2ObjectMapperBuilderCustomizer, определенный в классе @Configuration проекта - не могли бы вы указать мне строку кода? Направления здесь создают впечатление, что все, что мне нужно сделать, это определить этот компонент для управления тем, как ответы сериализуются в JSON, но он не работает - т.е. я не могу отключить любую из функций SerializationFeatures.

Немного предыстории:

  • Spring-boot 2.1.1 выпуск
  • spring-web mvc -5.1.3.release
  • Джексон 2.9.7

Я написал REST API (@RestController). Я не могу настроить способ, которым Джексон сериализует типы Java Instant в ответе http. Я пробовал различные комбинации определения бина ObjectMapper, бина MappingJackson2HttpMessageConverter, а также бина Jackson2ObjectMapperBuilderCustomizer в моей конфигурации (не все сразу):

@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
  return builder -> {
     builder.modules(new JavaTimeModule());
     builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
     builder.featuresToDisable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
  }
}

Когда я отлаживаю приложение, оно выглядит как RequestMappinghandap инициализирует свои конвертеры с помощью WebMvcConfigurationSupport, но все эти конвертеры создаются вручную, а не вводятся. То есть все преобразователи MappingJackson2HttpMessageConverter создаются с вызовами `new MappingJackson2HttpMessageConverter ()", который, в свою очередь, просто создает стандартные Jackson2ObjectMapperBuilders и ObjectMappers:


// in org.springframework:spring-web:5.1.3.RELEASE:

public class MappingJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
  // ... more
  public MappingJackson2HttpMessageConverter() {
      this(Jackson2ObjectMapperBuilder.json().build());
  }
}

public class Jackson2ObjectMapperBuilder {
  public static Jackson2ObjectMapperBuilder json() {
    return new Jackson2ObjectMapperBuilder();
  }
}

. HttpEntityMethod может использовать тот же ответ, что и он может использовать. не могу найти, где в этом жизненном цикле Jackson2ObjectMapperBuilderCustomizer выполняет настройку. Я знаю, что, должно быть, что-то пропустил, но я не смог его найти.

1 Ответ

0 голосов
/ 04 марта 2020
@Bean
@Primary
public ObjectMapper customMapper(){
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
    return mapper;
}

Добавьте приведенное выше определение bean-компонента в вашу конфигурацию. Это заставит весну использовать этот пользовательский компонент вместо стандартного.

...