Ada*_*ass 43 java spring json spring-mvc jackson
Spring 4.1实例化了一个Jackson ObjectMapper实例.我有理由希望@Autowire将该实例放入我的一个控制器中:控制器使用Jackson对其自己进行一些小的JSON解析,但ObjectMapper它使用的应该是Spring本身正在使用的同一个实例.我该如何完成呢?
请注意,我不是问如何自定义ObjectMapperSpring正在使用的配置; 我对默认值感到满意.我只想捕获Spring使用的实例,以便我可以在我自己的代码中重用现有实例.
Tun*_*uno 38
如果您在类路径中使用Spring Boot with Jackson并在REST控制器中使用JSON解析的默认实现,那么这应该可行:
@Autowired
private ObjectMapper jacksonObjectMapper;
Run Code Online (Sandbox Code Playgroud)
Eme*_*gia 13
如果你看一下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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您正在使用Spring Boot,那么本手册中有一节专门用于处理ObjectMapper如果您创建默认值Jackson2ObjectMapperBuilder @Bean,您应该能够ObjectMapper在控制器中自动装配相同的实例.
net*_*key 13
正如其他人所说,你不能@Autowired直接进入你的控制器.
@Emerson Farrugia建议使用创建新实例
Jackson2ObjectMapperBuilder.json().build()
Run Code Online (Sandbox Code Playgroud)
也没有为我工作,因为获得的实例不遵循spring.jackson.*配置属性,我需要它.
我找到的解决方案是从Spring获取MappingJackson2HttpMessageConverter可注入的ObjectMapper .
所以我自动装配了它:
@Autowired
private MappingJackson2HttpMessageConverter springMvcJacksonConverter;
Run Code Online (Sandbox Code Playgroud)
然后像这样从它获取ObjectMapper:
ObjectMapper objectMapper = springMvcJacksonConverter.getObjectMapper();
Run Code Online (Sandbox Code Playgroud)
这个实例的行为与Spring MVC自己的消息转换完全一样 - 无论如何它可能是相同的实例.
Lym*_*Zoy 12
由ObjectMapper创建Jackson2ObjectMapperBuilder,您可以使用以下方法注入构建器:
@Autowired
private Jackson2ObjectMapperBuilder mapperBuilder;
Run Code Online (Sandbox Code Playgroud)
然后使用mapperBuilder.build()构建一个ObjectMapper实例,这个实例可以使用application.properties. 官方文档在这里。
Wes*_*Gun 10
我调试了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();
}
Run Code Online (Sandbox Code Playgroud)
我们不能只@SpringBootTest(classes = Jackson2ObjectMapperBuilder.class)生成这个构建器。
当我们bootRun没有这个问题的时候。
配置在Jackson2ObjectMapperBuilderCustomizerConfiguration#customize(Jackson2ObjectMapperBuilder builder)方法中设置。
| 归档时间: |
|
| 查看次数: |
51760 次 |
| 最近记录: |