如何让Jackson序列化程序在所需的null属性上失败

时间:2017-08-09 05:36:55

标签: java jackson

如果遇到必需的null属性,我希望Jackson JSON序列化程序失败。

我知道我可以告诉omit null fieldsmapper.setSerializationInclusion(JsonInclude.Include.NON_NULL))。但是,我还要声明

@NotNull // BeanValidation
private String foo;

@JsonProperty(required = true) // Jackson databinding
private String foo;

如果此类字段为空,则序列化程序会失败。

1 个答案:

答案 0 :(得分:2)

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

首先创建一个自定义序列化程序,它接受另一个作为构造函数参数,并使用hibernate验证器来验证对象并抛出异常。

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);
    }
}

然后创建将使用此序列化程序的序列化修饰符:

class ValidatingSerializerModifier extends BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config,
             BeanDescription beanDesc, JsonSerializer<?> serializer) {
        return new ValidatingSerializer((JsonSerializer<Object>) serializer);
    }
}

最后使用ObjectMapper

SimpleModule注册此内容
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new ValidatingSerializerModifier());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

现在将使用此方法,并且只要对使用标准验证注释注释的字段进行验证失败,就会抛出异常:

@NotNull // BeanValidation
private String foo;