如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?

Posted

技术标签:

【中文标题】如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?【英文标题】:How can I get an ObjectMapper instance in Spring Boot without inheriting from spring-boot-starter-web? 【发布时间】: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 服务器时,最佳做法是什么?

【问题讨论】:

你不能只添加罐子吗? Configuring ObjectMapper in Spring的可能重复 问题是,Spring Boot 自动配置ObjectMapper,它可以通过几个有据可查的配置属性进行调整。如果我按照另一个问题的建议创建ObjectMapper,如果我没记错的话,所有这些都应该手动完成。 没有 web starter 的 Spring boot 不会初始化 ObjectMapper。这很愚蠢,他们打算你不会在 HTTP 之外使用 JSON:github.com/spring-projects/spring-boot/issues/10031 【参考方案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 依赖项,因为该类位于其中。

【讨论】:

但是如果这只是一个java应用而不是web应用,我该怎么办呢? github.com/spring-projects/spring-boot/issues/10031 对此有一些背景和理由。

以上是关于如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不从终端或任何编辑器执行的情况下运行 python 程序 [重复]

如何在不从 DataFrame 转换并访问它的情况下将列添加到 Dataset?

如何在不从参考节点获取所有数据的情况下获取 Firebase 数据库中的随机键?

如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?

如何在不从当前活动选项卡中获取焦点的情况下将子窗口添加到 QMdiArea(设置为 TAB 模式)?

为啥我们不能在不从 NSObject 继承类的情况下迅速采用协议?