java—是否可以为一个特定的执行配置objectmapper?

k2fxgqgv  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(320)

我正在做一个web项目,它使用一个静态objectmapper,它是通过xml文件配置的,应该在整个项目中生效。但是,我必须实现一个api来发送响应,不管设置如何,都不会忽略null属性。我的老板告诉我,他不想再创建一个objectmapper,创建我自己的json编写器被认为是多余的,所以这也是被禁止的。所以我被困在这里。我试过了。

Map<String, Object>resultMap = getResult();
        try {
            mapper.setSerializationInclusion(Include.ALWAYS);
            response = mapper.writeValueAsString(resultMap);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        } finally {
            if (ServiceConfig.isWriteNull()) {
                mapper.setSerializationInclusion(Include.ALWAYS);
            } else {
                mapper.setSerializationInclusion(Include.NON_NULL);
            }
        }

临时切换设置,它的工作。但是考虑到Map器是异步使用的,更改全局配置绝对是个坏主意。我还想过在配置切换之前锁定Map器,但是由于Map器是静态的,这可能是另一个坏主意。我想有一些像注解或参数魔术般影响单个执行整洁的方式。我想知道这是否可能?

3wabscal

3wabscal1#

Map<String, Object>resultMap = getResult();
         try {
            response = mapper
                .writer(SerializationFeature.WRITE_NULL_MAP_VALUES)
                .writeValueAsString(resultMap);
         } catch (JsonProcessingException e) { throw new RuntimeException(e);}
2j4z5cfb

2j4z5cfb2#

您当前拥有的是危险的,因为您正在临时更改全局Map器的配置。这也会影响同时使用同一Map器示例执行序列化的其他线程。
然而,还有另一种方法可以达到你所需要的。这个 ObjectMapper 示例有几个方法来创建 ObjectWriter -基于Map器的示例。

Map<String, Object> resultMap = getResult();
try {
    response = mapper
        .writer(SerializationFeature.WRITE_NULL_MAP_VALUES)
        .writeValueAsString(resultMap);
} catch (JsonProcessingException e) {
    throw new RuntimeException(e);
}

作为 @Stepan Stahlmann 在你的评论中说,你也可以创建一个临时的新 ObjectMapper 基于全局示例的示例,使用 ObjectMapper#copy() 方法。想法是一样的:使用全局 ObjectMapper 作为根目录进行配置,并进行一些调整,以便生成符合api约定的json。

Map<String, Object> resultMap = getResult();
try {
    response = mapper
        .copy()
        .setSerializationInclusion(Include.ALWAYS)
        .writeValueAsString(resultMap);
} catch (JsonProcessingException e) {
    throw new RuntimeException(e);
}

另一种方法。。。

我能想到的还有另外一种方法,而且我确信还有更多的方法。你可以把衣服包起来 resultMap 在存在某些注解的类中,这些注解应推翻Map器的默认行为:

package example;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonValue;

import java.util.Map;

// Your inclusion rule
@JsonInclude(JsonInclude.Include.ALWAYS)
public class ResponseWrapper {

    private final Map<String, Object> response;

    public ResponseWrapper(Map<String, Object> response) {
        this.response = response;
    }

    // tells Jackson to use the this a the actual value (so you don't see this wrapper in the json)
    @JsonValue
    public Map<String, Object> getResponse() {
        return this.response;
    }
}
Map<String, Object> resultMap = getResult();
try {
    response = mapper.writeValueAsString(new ResponseWrapper(resultMap));
} catch (JsonProcessingException e) {
    throw new RuntimeException(e);
}

相关问题