【问题标题】:How can I get an ObjectMapper instance in Spring Boot without inheriting from spring-boot-starter-web?如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?
【发布时间】:2017-12-02 03:05:18
【问题描述】:

我正在使用 Spring Boot 2.0.0M2,试图创建一个 CLI 应用程序,而不是 Web 应用程序。我的问题是,即使包括

  compile 'org.springframework.boot:spring-boot-starter'
  compile 'org.springframework.boot:spring-boot-starter-json'

在我的构建中,ObjectMapper 不是由 Boot 创建的,因为

Bean method 'jacksonObjectMapper' not loaded because @ConditionalOnClass did not find required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder'

当您想要拥有 Spring Boot 实例并配置 Jackson 但不想启动 Web 服务器时,最佳做法是什么?

【问题讨论】:

  • 你不能只添加罐子吗?
  • 问题是,Spring Boot 自动配置ObjectMapper,它可以通过几个有据可查的配置属性进行调整。如果我按照另一个问题的建议创建ObjectMapper,如果我没记错的话,所有这些都应该手动完成。
  • 没有 web starter 的 Spring boot 不会初始化 ObjectMapper。这很愚蠢,他们打算你不会在 HTTP 之外使用 JSON:github.com/spring-projects/spring-boot/issues/10031

标签: spring spring-mvc spring-boot jackson jackson-databind


【解决方案1】:

如果您想避免包含完整的 Web 堆栈(自 Spring Boot v.2.0.0M4 起),您可以添加 spring-boot-starter-json

【讨论】:

  • 这对我有用。谢谢你。最佳解决方案是否向前推进?
【解决方案2】:

你为什么不自己初始化呢。

@Bean
ObjectMapper objectMapper() {
    return new ObjectMapper();
}

【讨论】:

  • 我的问题是,正如我在之前的评论中所说,Spring Boot 自动配置 ObjectMapper 具有几个有据可查的配置属性。如果我自己实例化,如果我没记错的话,所有这些调整都会丢失。
  • 是的,您需要手动完成,但这并不难,并且查看Jackson2ObjectMapperBuilder 的源代码似乎没有设置任何默认值。它确实会自动检测一些知名模块,但手动添加它们并不难。如果你真的想要,你可以将 java 复制到你的代码中,它是 ASL2,但我只会使用我自己的对象包装器。
  • 但这应该可以通过使用@Autowired ObjectMapper objectMapper 来实现。如果我们自己初始化它,这不会是一个聪明的解决方案吧?
【解决方案3】:

您可以尝试添加 org.springframework:spring-web 依赖项,因为该类位于其中。

【讨论】:

猜你喜欢
  • 2014-09-07
  • 2020-10-27
  • 2016-01-29
  • 1970-01-01
  • 2017-02-19
  • 2021-01-22
  • 1970-01-01
  • 2017-03-23
  • 2019-10-28
相关资源
最近更新 更多