【问题标题】:How to maintain case during serializing using object mapper?如何在使用对象映射器进行序列化时维护大小写?
【发布时间】:2019-10-17 11:29:36
【问题描述】:

我有一个监听队列的监听器。来自队列的消息是 json 文本。我需要处理它们,然后保存在 mongodb 数据库中。我已经为传入的 json 使用了 DTO。问题是我只能将数据保存为小写,因为我使用了 DTO。但是,传入的数据是大写的。如何使用 jackson/spring 优雅地做到这一点?

我在 DTO 中尝试了 @JsonGetter 和 @JsonSetter。但是,那没有用。它仍然将数据保存为小写。

我的代码的迷你版:

DTO:

public String getMessage() {
return message;
}

@JsonSetter("MESSAGE")
public void setMessage(String message){
this.message = message;
}

数据保存器:

mongoOperations.save(DTO,collectionname);

数据库中的文档:

_id: ObjectId("5da831183852090ddc7075fb")
message: "hi"

我希望 mongodb 中的数据为:

_id: ObjectId("5da831183852090ddc7075fb")
MESSAGE: "hi"

传入数据的键为 MESSAGE。所以,我想存储相同的数据。我不希望 DTO 字段名称为大写。

【问题讨论】:

标签: spring jackson dto


【解决方案1】:

根据上面评论的@MichaelZiober,与杰克逊相关的注释都没有帮助我的需要。 spring 的@Field 注释起作用了。

【讨论】:

    【解决方案2】:

    应该使用 @JsonProperty("MESSAGE") 如果不是(出于某种原因) - 您可以为此字段使用自定义序列化程序

    class CustomStringSerializer extends JsonSerializer<String> {
    
        @Override
        public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
            jgen.writeStartObject();
            jgen.writeObjectField("MESSAGE", value);
            jgen.writeEndObject();
        }
    
    }
    

    并以这种方式初始化映射器:

        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule mod = new SimpleModule("message");
        mod.addSerializer(String.class, new CustomStringSerializer());
        objectMapper.registerModule(mod);
    

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多