0

我正在使用不可变库(https://immutables.github.io)。

我的班级如下所示:

package com.abc.myservice.data.models;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.immutables.value.Value;

import java.util.Map;
import java.util.Optional;

@Value.Immutable
@JsonSerialize(as = ImmutableMyEntityModel.class)
@JsonDeserialize(as = ImmutableMyEntityModel.class)
public interface MyEntityModel {
    String myEntityId();
    String status();
    Optional<Integer> count();
    Optional<Integer> version();
    Optional<Map<String, String>> attributes();
}

我使用以下方法构建不可变类对象:

ImmutableMyEntityModel.builder()
    .myEntityId("some-id")
    .status("some-status")
    .count(Optional.of(10))
    .build()

我的输出是:

{
    "MyEntityId": "some-id",
    "status": "some-status",
    "count": {
        "present": true
    },
    "version": {
        "present": false
    },
    "attributes": {
        "present": false
    }
}

相反,我想看到的是:

{
    "MyEntityId": "some-id",
    "status": "some-status",
    "count": 10
}

我怎样才能让它像那样工作?

4

1 回答 1

1

使用该jackson-datatype-jdk8模块以便 Jackson 正确理解类型 -这篇文章java.util.Optional中有一个很好的解释。


  • jackson-datatype-jdk8库添加到您的项目/类路径中,其中包含一个 Jackson 模块,可以让 Jackson 正确理解 Optionals。
  • 创建 ObjectMapper 时,注册 Jdk8Module:
ObjectMapper om = new ObjectMapper();
om.registerModule(new Jdk8Module());
  • 或者,添加@JsonIgnoreProperties(ignoreUnknown = true)到属性或类本身以避免序列化为Optional.empty()空值,而是完全忽略该属性。

完整示例:

public class JacksonOptionalTest
{
    public static void main(String... args)
    throws Exception
    {
        ObjectMapper om = new ObjectMapper();
        om.registerModule(new Jdk8Module());

        Thing thing = new Thing();
        thing.name = "John Smith";
        thing.count = Optional.of(12);

        String s = om.writeValueAsString(thing);
        System.out.println(s);
    }

    @JsonInclude(Include.NON_ABSENT)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Thing
    {
        public String name;
        public Optional<Integer> count = Optional.empty();
        public Optional<Integer> version = Optional.empty();
    }
}

这个的输出是{"name":"John Smith","count":12}

于 2021-10-11T21:45:31.747 回答