如何获得Spring 4.1使用的Jackson ObjectMapper?

时间:2015-05-05 17:56:12

标签: java json spring spring-mvc jackson

Spring 4.1实例化了一个Jackson ObjectMapper实例。我有理由想要@Autowire该实例进入我的一个控制器:控制器使用Jackson对它自己做一些小的JSON解析,但它使用的ObjectMapper应该是Spring的同一个实例本身正在使用。我该如何完成这项工作?

请注意,我并未询问如何自定义配置Spring正在使用的ObjectMapper;我对默认值感到满意。我只想捕获Spring使用的实例,以便我可以在我自己的代码中重用现有的实例。

7 个答案:

答案 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)

如果愿意,可以使用两步器;

  1. @SpringBootApplication课程中,添加:

    @Bean
    public ObjectMapper mapper() {
      return new ObjectMapper();
    }
    
  2. 您希望使用的任何地方ObjectMapper

    @Autowired
    ObjectMapper mapper;
    
  3. 和平!

答案 4 :(得分:1)

ObjectMapperJackson2ObjectMapperBuilder创建,您可以使用以下方法注入构建器:

@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)方法设置配置。

enter image description here