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

9
我正在尝试使用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服务器,那么最佳实践是什么?


你不能只是添加这个jar文件吗? - K.Nicholas
2
可能是在Spring中配置ObjectMapper的重复问题。 - ledniov
事实上,Spring Boot自动配置了ObjectMapper,并且可以通过几个经过充分文档化的配置属性进行调整。如果我像其他问题所建议的那样创建ObjectMapper,那么所有这些都需要手动完成,如果我没有弄错的话。 - Serandel
Spring Boot没有使用Web Starter时不会初始化ObjectMapper。这很愚蠢,他们认为你不会在HTTP之外使用JSON:https://github.com/spring-projects/spring-boot/issues/10031 - Leos Literak
3个回答

18

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


这对我很有帮助。谢谢你。这是未来的最佳解决方案吗? - khwilo

4
为什么不直接自己初始化呢?
@Bean
ObjectMapper objectMapper() {
    return new ObjectMapper();
}

1
我的问题是,正如我在先前的评论中所说,Spring Boot会自动配置ObjectMapper,并提供了几个经过充分文档化的配置属性。如果我自己实例化它,所有这些调整都将丢失,如果我没有理解错的话。 - Serandel
是的,你需要手动完成它,但这并不难,查看Jackson2ObjectMapperBuilder的源代码,它似乎没有设置任何默认值。它确实可以自动检测一些知名模块,但手动添加它们并不难。如果你真的想要,你可以将Java代码复制到你的代码中,它是ASL2许可证,但我会使用自己的对象包装器。 - Leonard Brünings
1
但是只要使用@Autowired ObjectMapper objectMapper,这应该就可以工作了。如果我们自己初始化它,那么这不是一个明智的解决方案,对吧? - liyuhui

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

但如果这只是一个Java应用程序而不是Web应用程序,我该怎么办? - liyuhui
https://github.com/spring-projects/spring-boot/issues/10031 对此提供了一些背景和理由。 - Adrian Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接