当未在 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
。您可以像示例中的其他 属性 一样启用它。
给定代码:
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
。您可以像示例中的其他 属性 一样启用它。