如果getter抛出异常,如何使Jackson忽略属性

轻易地:

我有许多来自供应商的类,它们喜欢在属性访问时随机抛出RuntimeExceptions。

public Object getSomeProperty() {
    if (!someObscureStateCheck()) {
        throw new IllegalStateExcepion();
    }
    return calculateTheValueOfProperty(someRandomState);
}

我不能更改类,不能添加注释,并且为每个单独的类定义mixin是不现实的,因为堆栈的这一部分经常更改。

如果杰克逊的getter引发异常,如何使杰克逊忽略该属性?

那里:

在Jackson中执行自定义序列化,您可以使用来注册一个模块,该模块BeanSerializerModifier指定需要进行的任何修改。对于您而言,BeanPropertyWriter.serializeAsField是负责序列化各个字段的方法,因此您应该使自己的方法BeanPropertyWriter忽略字段序列化的异常,并BeanSerializerModifier使用changeProperties注册一个模块,该模块用于BeanPropertyWriter用自己的实现替换所有默认实例。以下示例演示:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.*;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

public class JacksonIgnorePropertySerializationExceptions {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new SimpleModule().setSerializerModifier(new BeanSerializerModifier() {
            @Override
            public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
                return beanProperties.stream().map(bpw -> new BeanPropertyWriter(bpw) {
                    @Override
                    public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception {
                        try {
                            super.serializeAsField(bean, gen, prov);
                        } catch (Exception e) {
                            System.out.println(String.format("ignoring %s for field '%s' of %s instance", e.getClass().getName(), this.getName(), bean.getClass().getName()));
                        }
                    }
                }).collect(Collectors.toList());
            }
        }));

        mapper.writeValue(System.out, new VendorClass());
    }

    public static class VendorClass {
        public String getNormalProperty() {
            return "this is a normal getter";
        }

        public Object getProblematicProperty() {
            throw new IllegalStateException("this getter throws an exception");
        }

        public String getAnotherNormalProperty() {
            return "this is a another normal getter";
        }
    }
}

上面的代码使用Jackson 2.7.1和Java 1.8输出以下内容:

ignoring java.lang.reflect.InvocationTargetException for field 'problematicProperty' of JacksonIgnorePropertySerializationExceptions$VendorClass instance
{"normalProperty":"this is a normal getter","anotherNormalProperty":"this is a another normal getter"}

显示getProblematicProperty抛出的IllegalStateException,将从序列化值中省略。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Java

如何忽略Jackson添加的默认属性?

来自分类Dev

如果构造函数抛出异常,如何删除对象?

来自分类Dev

如果输入不是bigDecimal,如何抛出异常并再次扫描?

来自分类Dev

如何动态忽略Jackson序列化的属性

来自分类Java

Jackson序列化:如何忽略超类属性

来自分类Java

异常抛出如何工作?

来自分类Python

如何正确忽略异常

来自分类Java

我可以在Java Jackson的反序列化过程中忽略基于getter的只写属性吗?

来自分类Dev

如果构造函数抛出异常会怎样?

来自分类Dev

如果抛出异常,“固定”是否正确清理?

来自分类Dev

如果抛出异常,SBT编译将失败

来自分类Dev

如果方法抛出异常,则更改textblock的前景

来自分类Dev

如果某些可观察到的异常抛出,该如何继续播放?

来自分类Dev

如何从可选值中提取字段参数,或者如果为null则抛出异常?

来自分类Java

如果在子类java中抛出类异常,如何更改参数

来自分类Dev

如何捕获重新抛出的异常?

来自分类Java

如何知道抛出哪个异常

来自分类Java

如何创建并抛出Java异常?

来自分类Dev

如何明确不抛出异常?

来自分类Java

忽略Jackson OnDemand中的嵌套属性

来自分类Java

如何使BlazeDS忽略属性?

来自分类Java

如何忽略Java中的异常

来自分类Python

Python:如何忽略异常并继续?

来自分类Dev

循环时如何忽略异常?

来自分类Java

使用Jackson转换Java对象时如何忽略可选属性

来自分类Dev

序列化并忽略引发异常的属性

来自分类Java

如何我告诉Springdata存储库的删除方法如果一个实体不存在不抛出异常?

来自分类Dev

如何使用json.net忽略类中的属性(如果为null)

来自分类Dev

我如何使用PojoCodecProvider忽略getter / setter

TOP 榜单

热门标签

归档