Подтвердить что ты не робот

Как я могу получить ObjectMapper от Jackson, используя Spring 4.1?

Spring 4.1 создает экземпляр экземпляра Jackson ObjectMapper. У меня есть причина, чтобы захотеть @Autowire этот экземпляр в один из моих контроллеров: контроллер выполняет какой-то небольшой JSON-анализ своего собственного использования с помощью Jackson, но используемым ObjectMapper должен быть тот и тот же экземпляр, который сам Spring с помощью. Как я могу это сделать?

Обратите внимание, что я не спрашиваю, как настраивать ObjectMapper для использования Spring; Я доволен настройками по умолчанию. Я просто хочу ловить экземпляр, используемый Spring, чтобы я мог повторно использовать существующий экземпляр в моем собственном коде.

4b9b3361

Ответ 1

Если вы используете Spring Boot with Jackson в своем пути к классам и реализацию по умолчанию для разбора JSON в вашем контроллере REST, тогда это должно работать:

@Autowired
private ObjectMapper jacksonObjectMapper;

Ответ 2

Если вы посмотрите на MappingJackson2HttpMessageConverter, вы увидите, что он создает новый ObjectMapper, но не представляет его как компонент. Есть геттер, но единственный способ, которым я выловил его в прошлом, это когда я сам создал MappingJackson2HttpMessageConverter, например

public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        MappingJackson2HttpMessageConverter jacksonMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = jacksonMessageConverter.getObjectMapper();

        objectMapper.registerModule(new JodaModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);

        converters.add(jacksonMessageConverter);
    }
}

Если вы работаете с Spring ботинком, есть раздел в руководстве, посвященное работу с ObjectMapper Если вы создаете по умолчанию Jackson2ObjectMapperBuilder @Bean, вы должны быть в состоянии autowire того же ObjectMapper экземпляра в контроллере.

Ответ 3

Как было сказано другими, вы не можете @Autowired его прямо в свой контроллер.

@Emerson Farrugia предложит создать новый экземпляр с помощью

Jackson2ObjectMapperBuilder.json().build()

также не работал у меня, потому что полученный экземпляр не соответствовал параметрам конфигурации spring.jackson.*, в которых я нуждался в нем.


Решение, которое я нашел, это получить ObjectMapper от Spring MappingJackson2HttpMessageConverter, который можно вводить.

Итак, я выполнил автообновление:

@Autowired
private MappingJackson2HttpMessageConverter springMvcJacksonConverter;

а затем получить ObjectMapper из него следующим образом:

ObjectMapper objectMapper = springMvcJacksonConverter.getObjectMapper();

Этот экземпляр ведет себя точно так же, как Spring преобразование собственных сообщений MVC - это, вероятно, один и тот же экземпляр.

Ответ 4

Два шага, если хотите;

  1. В классе @SpringBootApplication добавьте:

    @Bean
    public ObjectMapper mapper() {
      return new ObjectMapper();
    }
    
  2. Где угодно вы хотите использовать ObjectMapper:

    @Autowired
    ObjectMapper mapper;
    

Мир!

Ответ 5

ObjectMapper создается Jackson2ObjectMapperBuilder, и вы можете внедрить конструктор, используя:

@Autowired
private Jackson2ObjectMapperBuilder mapperBuilder;

Затем используйте mapperBuilder.build() для создания экземпляра ObjectMapper, и этот экземпляр может использовать конфигурации в application.properties. Официальный документ здесь.

Ответ 6

Когда вы пытаетесь @Autowire MappingJackson2HttpMessageConverter, он дает вам: No qualifying bean of type 'org.springframework.http.converter.json.MappingJackson2HttpMessageConverter' available: expected single matching bean but found 4: mappingJackson2HttpMessageConverter,jacksonHttpMessageConverter,halJacksonHttpMessageConverter,alpsJsonHttpMessageConverter.

Это не большая проблема, вы можете просто изменить имя переменной на один из приведенных выше, чтобы получить этот экземпляр: @Autowired private MappingJackson2HttpMessageConverter halJacksonHttpMessageConverter;