当未在 json 中设置原语值时,如何使 jackson 抛出错误?

How can I make jackson throwing error when a value for primitive is not set in json?

给定代码:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        System.out.println(new ObjectMapper().readValue("{}", Foo.class));
    }

    public static class Foo {
        long id;

        public long getId() { return id; }
        public void setId(long id) { this.id = id; }

        @Override
        public String toString() { return "For(id=" + id + ')'; }
    }
}

我想在 id 字段中抛出异常而不是 0。 我尝试了 @JsonProperty(required = true)@JsonInclude(JsonInclude.Include.NON_DEFAULT) 等不同的方法,但它不起作用,仍然只是默默地设置 0

在JSON中字段没有值或设置为空时,如何强制它抛出异常?

据我所知,只有在使用构造函数时才受支持。控制它的特征是DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES。您需要注释构造函数,jackson 将使用 @JsonCreator 和构造函数中的参数 @JsonProperty。像这样:

public class Foo {

    long id;

    @JsonCreator
    public Foo(@JsonProperty("id") long id) {
        this.id = id;
    }

    //getters and setters

    @Override
    public String toString() {
        return "For(id=" + id + ')';
    }
}

并为映射器启用该功能。

public class Main {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true);
        System.out.println(mapper.readValue("{}", Foo.class));
    }
}

编辑: 这仅适用于内容中缺少的属性。如果您需要特别失败 null 属性(不适用于您的情况,因为您使用原语,但为了完整性而添加),您需要此功能 DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES。您可以像示例中的其他 属性 一样启用它。