Ответ 1
Если вы используете Spring Boot with Jackson в своем пути к классам и реализацию по умолчанию для разбора JSON в вашем контроллере REST, тогда это должно работать:
@Autowired
private ObjectMapper jacksonObjectMapper;
Spring 4.1 создает экземпляр экземпляра Jackson ObjectMapper
. У меня есть причина, чтобы захотеть @Autowire
этот экземпляр в один из моих контроллеров: контроллер выполняет какой-то небольшой JSON-анализ своего собственного использования с помощью Jackson, но используемым ObjectMapper
должен быть тот и тот же экземпляр, который сам Spring с помощью. Как я могу это сделать?
Обратите внимание, что я не спрашиваю, как настраивать ObjectMapper
для использования Spring; Я доволен настройками по умолчанию. Я просто хочу ловить экземпляр, используемый Spring, чтобы я мог повторно использовать существующий экземпляр в моем собственном коде.
Если вы используете Spring Boot with Jackson в своем пути к классам и реализацию по умолчанию для разбора JSON в вашем контроллере REST, тогда это должно работать:
@Autowired
private ObjectMapper jacksonObjectMapper;
Если вы посмотрите на 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
экземпляра в контроллере.
Как было сказано другими, вы не можете @Autowired
его прямо в свой контроллер.
@Emerson Farrugia предложит создать новый экземпляр с помощью
Jackson2ObjectMapperBuilder.json().build()
также не работал у меня, потому что полученный экземпляр не соответствовал параметрам конфигурации spring.jackson.*
, в которых я нуждался в нем.
Решение, которое я нашел, это получить ObjectMapper от Spring MappingJackson2HttpMessageConverter
, который можно вводить.
Итак, я выполнил автообновление:
@Autowired
private MappingJackson2HttpMessageConverter springMvcJacksonConverter;
а затем получить ObjectMapper из него следующим образом:
ObjectMapper objectMapper = springMvcJacksonConverter.getObjectMapper();
Этот экземпляр ведет себя точно так же, как Spring преобразование собственных сообщений MVC - это, вероятно, один и тот же экземпляр.
В классе @SpringBootApplication
добавьте:
@Bean
public ObjectMapper mapper() {
return new ObjectMapper();
}
Где угодно вы хотите использовать ObjectMapper
:
@Autowired
ObjectMapper mapper;
Мир!
ObjectMapper
создается Jackson2ObjectMapperBuilder
, и вы можете внедрить конструктор, используя:
@Autowired
private Jackson2ObjectMapperBuilder mapperBuilder;
Затем используйте mapperBuilder.build()
для создания экземпляра ObjectMapper
, и этот экземпляр может использовать конфигурации в application.properties
. Официальный документ здесь.
Когда вы пытаетесь @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;