如何让@JsonIgnoreProperties在Jackson自定义懒加载序列化器中生效?
解决自定义懒加载序列化器忽略@JsonIgnoreProperties的问题
问题根源
你的自定义序列化器中直接调用gen.writeObject(value),该方法会绕过Jackson的注解处理上下文,直接使用最基础的序列化逻辑,导致@JsonIgnoreProperties这类注解规则无法被应用。
修复方案
修改LazyValueSerializer的serialize方法,通过SerializerProvider获取目标类型对应的序列化器,再调用其序列化方法,让Jackson完整处理目标对象上的所有注解配置:
public class LazyValueSerializer extends JsonSerializer<Object> { @Override public boolean isEmpty(SerializerProvider provider, Object value) { return value == null || !Hibernate.isInitialized(value); } @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 通过序列化器上下文获取适配目标类型的序列化器,保留注解处理逻辑 JsonSerializer<Object> targetSerializer = serializers.findValueSerializer(value.getClass()); targetSerializer.serialize(value, gen, serializers); } }
额外优化建议
- 缓存序列化器:如果序列化频繁,可以考虑缓存已查找的序列化器,减少重复查找开销(注意线程安全)
- 兼容泛型集合:对于
List<CallEvent>这类集合属性,findValueSerializer会自动匹配集合序列化器,集合内元素的注解规则也会被正常处理 - 保留原内省逻辑:你的
LazyValueIntrospector逻辑无需修改,确保只有ORM注解标记的属性才会应用该自定义序列化器
修改后,序列化Call对象的events属性时,Jackson会自动识别CallEvent类的@JsonIgnoreProperties规则,忽略call属性的序列化。
内容的提问来源于stack exchange,提问作者hurelhuyag
相关产品推荐
相关产品推荐

