我有许多来自供应商的类,它们喜欢在属性访问时随机抛出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] 删除。
我来说两句