Spring 4.1实例化了一个Jackson ObjectMapper
实例。我有理由想要@Autowire
该实例进入我的一个控制器:控制器使用Jackson对它自己做一些小的JSON解析,但它使用的ObjectMapper
应该是Spring的同一个实例本身正在使用。我该如何完成这项工作?
请注意,我并未询问如何自定义配置Spring正在使用的ObjectMapper
;我对默认值感到满意。我只想捕获Spring使用的实例,以便我可以在我自己的代码中重用现有的实例。
答案 0 :(得分:35)
如果您在类路径中使用Spring Boot with Jackson,并在REST控制器中使用JSON解析的默认实现,那么这应该可行:
@Autowired
private ObjectMapper jacksonObjectMapper;
答案 1 :(得分:12)
如果您查看MappingJackson2HttpMessageConverter
,您会发现它会创建一个新的ObjectMapper
,但不会将其公开为bean。这是一个吸气剂,但我过去唯一的方法就是我自己创造了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 Boot,那么手册中的section专门用于处理ObjectMapper
如果您创建默认Jackson2ObjectMapperBuilder
{{1您应该能够在控制器中自动装配相同的@Bean
实例。
答案 2 :(得分:12)
正如其他人所说,你不能@Autowired
直接进入你的控制器。
@Emerson Farrugia建议使用
创建一个新实例Jackson2ObjectMapperBuilder.json().build()
对我来说也没有用,因为获取的实例没有遵循我需要它的spring.jackson.*
配置属性。
我找到的解决方案是从Spring MappingJackson2HttpMessageConverter
获取可注入的ObjectMapper。
所以我通过电子邮件发送了它:
@Autowired
private MappingJackson2HttpMessageConverter springMvcJacksonConverter;
然后从中获取ObjectMapper:
ObjectMapper objectMapper = springMvcJacksonConverter.getObjectMapper();
此实例的行为与Spring MVC自己的消息转换完全相同 - 无论如何它 可能是。
答案 3 :(得分:2)
在@SpringBootApplication
课程中,添加:
@Bean
public ObjectMapper mapper() {
return new ObjectMapper();
}
您希望使用的任何地方ObjectMapper
:
@Autowired
ObjectMapper mapper;
和平!
答案 4 :(得分:1)
ObjectMapper
由Jackson2ObjectMapperBuilder
创建,您可以使用以下方法注入构建器:
@Autowired
private Jackson2ObjectMapperBuilder mapperBuilder;
然后使用mapperBuilder.build()
来构建ObjectMapper
实例,并且该实例可以使用application.properties
中的配置。 Official doc here.
答案 5 :(得分:0)
当您尝试@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;
答案 6 :(得分:0)
我已经调试了Spring Boot的源代码,发现只有当我们启动整个上下文Jackson2ObjectMapperBuilder
时,才会包含我们放在application.yml
中的配置。
这意味着,如果要在Spring Boot测试中使用JUnit 5生成ObjectMapper,则必须:
@ExtendWith(SpringExtension.class)
@SpringBootTest
class SomeTest {
@Autowired
private Jackson2ObjectMapperBuilder builder;
...
@Test
void testObjectMapper() {
ObjectMapper mapper = builder.build();
}
我们不能仅使@SpringBootTest(classes = Jackson2ObjectMapperBuilder.class)
来生成此构建器。
当我们bootRun
时,我们就没有这个问题。
使用Jackson2ObjectMapperBuilderCustomizerConfiguration#customize(Jackson2ObjectMapperBuilder builder)
方法设置配置。