如何获得Spring 4.1使用的Jackson对象Map器?

r3i60tvu  于 2022-11-09  发布在  Spring
关注(0)|答案(8)|浏览(209)

Spring 4.1示例化了一个Jackson的ObjectMapper示例,我有理由将这个示例@Autowire到我的一个控制器中:控制器使用Jackson自己做一些小的JSON解析,但是它使用的ObjectMapper应该是Spring本身正在使用的同一个示例。
请注意,我不是在问如何自定义配置Spring使用的ObjectMapper;我对默认值很满意,我只想找到Spring out使用的示例,这样我就可以在自己的代码中重用现有的示例。

qlckcl4x

qlckcl4x1#

如果您在类路径上使用Spring Boot和Jackson,并在REST控制器中使用JSON解析的默认实现,那么应该可以这样做:

@Autowired
private ObjectMapper jacksonObjectMapper;
lsmepo6l

lsmepo6l2#

正如其他人所说,你不能直接将它@Autowired到你的控制器中。
@Emerson Farrugia建议使用以下内容创建新示例

Jackson2ObjectMapperBuilder.json().build()

我也不满意,因为获得的示例没有遵循spring.jackson.*配置属性,而我需要它。
我找到的解决方案是从Spring的MappingJackson2HttpMessageConverter获得ObjectMapper,它是可注入的。
所以我自动连线:

@Autowired
private MappingJackson2HttpMessageConverter springMvcJacksonConverter;

然后像这样从中获取ObjectMapper:

ObjectMapper objectMapper = springMvcJacksonConverter.getObjectMapper();

这个示例的行为与SpringMVC自己的消息转换完全一样--它可能 * 是 * 同一个示例。

eqfvzcg8

eqfvzcg83#

如果你看一下MappingJackson2HttpMessageConverter,你会发现它创建了一个新的ObjectMapper,但是没有把它公开为bean。这里有一个getter,但是我过去唯一的方法是在我自己创建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,手册中有一节专门介绍如何使用ObjectMapper。如果您创建了默认的Jackson2ObjectMapperBuilder@Bean,您应该能够在控制器中自动连接相同的ObjectMapper示例。

pdtvr36n

pdtvr36n4#

ObjectMapper是由Jackson2ObjectMapperBuilder创建的,您可以使用以下方法注入构建器:

@Autowired
private Jackson2ObjectMapperBuilder mapperBuilder;

然后使用mapperBuilder.build()构建一个ObjectMapper示例,这个示例可以使用application.properties中的配置。

kcugc4gi

kcugc4gi5#

我已经调试了Spring Boot的源代码,发现只有当我们启动整个上下文Jackson2ObjectMapperBuilder时,application.yml才会包含我们放在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)方法中设置。

ygya80vv

ygya80vv6#

当您尝试 @autowired MappingJackson 2 HttpMessageConverter时,它会提供: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;

0tdrvxhp

0tdrvxhp7#

Spring 4.3的更新:

  • 从Spring4.3开始,具有单个构造函数的类可以省略@Autowired注解
  • 因此,如果您添加一个采用ObjectMapper参数的构造函数,则它将自动与Jackson ObjectMapper示例关联,而无需使用注解@Autowired
jogvjijk

jogvjijk8#

如果你愿意的话,两步走;
1.在您的@SpringBootApplication类中,添加:

@Bean
public ObjectMapper mapper() {
  return new ObjectMapper();
}

1.在任何您希望使用ObjectMapper的地方:

@Autowired
ObjectMapper mapper;

安静!

相关问题