如何在 spring 引导项目中为 Unirest 配置 ObjectMapper

How to configure the ObjectMapper for Unirest in a spring boot project

我在一个适合我的项目中使用 Unirest。但是,我想要 post 一些数据并且不想转义所有 JSON 因为它看起来很丑而且只是颈部疼痛。

我找到了一些关于如何为 Unirest 配置 ObjectMapper 的链接,它提供了这段代码。

Unirest.setObjectMapper(new ObjectMapper() {
        com.fasterxml.jackson.databind.ObjectMapper mapper = 
 new com.fasterxml.jackson.databind.ObjectMapper();

        public String writeValue(Object value) {
            try {
                return mapper.writeValueAsString(value);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }

        }

        public <T> T readValue(String value, Class<T> valueType) {

            try {
                return mapper.readValue(value, valueType);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }
    });

但是,没有示例显示在 Spring 引导 API 项目中最好在哪里执行此操作。

我试图在主 class 方法中设置它,但我收到 'setObjectMapper' 无法解决的错误。我也尝试在控制器中执行此操作,但出现相同的错误。

我对这两个库的 Gradle 支持是:

// https://mvnrepository.com/artifact/com.mashape.unirest/unirest-java
compile group: 'com.mashape.unirest', name: 'unirest-java', version: '1.4.5'
compile 'com.fasterxml.jackson.core:jackson-databind:2.10.1'

任何人都可以告诉我如何在 Spring Boot API 项目中使用 Jackson 对象映射器和 Unirest,因为我已经谷歌搜索和阅读文档两天了。非常感谢您的帮助。

提前致谢

这里有几个问题:

  1. 您使用的 unirest 版本 (1.4.5) 不包含配置对象映射器的功能。此功能是后来添加的 (github PR)。所以你应该更新到 maven central - 1.4.9 上可用的最新版本。仅此一项就可以解决您的编译问题。
  2. 您可以将您的 Unirest 配置代码保留在 main 方法中。然而,如果你不想使用默认的 jackson ObjectMapper(),而是来自 spring 上下文的那个,那么最好创建一个类似假 spring bean 的东西来注入 ObjectMapper:
@Configuration
public class UnirestConfig {

    @Autowired
    private com.fasterxml.jackson.databind.ObjectMapper mapper;

    @PostConstruct
    public void postConstruct() {
        Unirest.setObjectMapper(new ObjectMapper() {

            public String writeValue(Object value) {
                try {
                    return mapper.writeValueAsString(value);
                } catch (JsonProcessingException e) {
                    throw new RuntimeException(e);
                }
            }

            public <T> T readValue(String value, Class<T> valueType) {
                try {
                    return mapper.readValue(value, valueType);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        });
    }
}

除此之外,这个库似乎更改了包名称。现在是 com.konghq。您可能要考虑更新,但库 API 可能已更改。

更新:为最新版本

compile group: 'com.konghq', name: 'unirest-java', version: '3.1.04'

新的 API 是 Unirest.config().setObjectMapper(...)