Java 如何使Jackson序列化程序在需要的属性为null时失败

Java 如何使Jackson序列化程序在需要的属性为null时失败,java,jackson,Java,Jackson,我希望Jackson JSON序列化程序在遇到空属性时失败 我知道我可以告诉它(mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL))。但是,另外,我想声明 @NotNull // BeanValidation private String foo; 或 如果这些字段为空,序列化程序将失败。我看不到任何注释或配置选项。在序列化之前,可以使用hibernate验证程序验证对象。由于不希望添加自定义注释,因此可以通过在序列化之

我希望Jackson JSON序列化程序在遇到空属性时失败

我知道我可以告诉它(
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
)。但是,另外,我想声明

@NotNull // BeanValidation
private String foo;


如果这些字段为空,序列化程序将失败。

我看不到任何注释或配置选项。在序列化之前,可以使用hibernate验证程序验证对象。由于不希望添加自定义注释,因此可以通过在序列化之前验证对象来修改默认序列化程序

首先创建一个自定义序列化程序,将另一个序列化程序作为构造函数参数,并使用hibernate validator验证对象并引发异常

class ValidatingSerializer extends JsonSerializer<Object> {
    private final JsonSerializer<Object> defaultSerializer;
    private final Validator validator;

    ValidatingSerializer(final JsonSerializer<Object> defaultSerializer) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        this.validator = factory.getValidator();
        this.defaultSerializer = defaultSerializer;
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider)
            throws IOException {
        if (!validator.validate(value).isEmpty()) {
            throw new IOException("Null value encountered");
        }
        defaultSerializer.serialize(value, gen, provider);
    }
}
现在将使用此选项,并且每当使用标准验证注释注释的字段验证失败时,将抛出异常:

@NotNull // BeanValidation
private String foo;

很酷,感谢大家为修改后的答案付出的努力。如果可以的话,我会投两次票。顺便说一句,这个问题的原因来自于。简而言之,如果REST API的OpenAPI定义说JSON属性A#foo是强制性的,那么如果不能满足非空约束,消费者/客户端可能会认为请求失败(即返回HTTP 5xx)。
class ValidatingSerializerModifier extends BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config,
             BeanDescription beanDesc, JsonSerializer<?> serializer) {
        return new ValidatingSerializer((JsonSerializer<Object>) serializer);
    }
}
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new ValidatingSerializerModifier());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
@NotNull // BeanValidation
private String foo;