序列化休眠对象时引发奇怪的杰克逊异常

2022-08-31 16:00:34

杰克逊抛出了一个我不知道如何解决的奇怪异常。我正在使用Spring,Hibernate和Jackson。

我已经考虑过延迟加载是导致问题的原因,但我已采取措施告诉 Jackson 不要按如下方式处理各种属性:

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" })
public class Director extends UserAccount implements EducationFacilityUser {
   ....
}

我也对所有其他UserAccount子类做了同样的事情。

下面是引发的异常:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[46]->jobprep.domain.educationfacility.Director_$$_javassist_2["handler"])
    at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:146)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:118)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:236)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:189)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:111)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)

有关如何获取更多信息以查看导致此问题的原因的建议?有人知道如何解决它吗?

编辑:我发现代理对象上存在getHander()和其他get*()方法。咕噜咕噜!!有没有办法告诉杰克逊不要在代理上处理任何东西,或者我是sol吗?这真的很奇怪,因为吐出JSON的方法只在某些情况下崩溃,而不是一直崩溃。尽管如此,这是由于代理对象上的get*()方法。

题外话:代理是邪恶的。它们破坏了 Jackson、equals() 和常规 Java 编程的许多其他部分。我很想完全放弃冬眠:/


答案 1

我遇到了类似的问题,通过休眠代理对象进行延迟加载。通过注释具有惰性加载私有属性的类来解决这个问题:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

我假设您可以在代理对象上添加中断 JSON 序列化的属性到该注释。

避免对未获取的惰性对象进行 Jackson 序列化


答案 2

这并不理想,但您可以在类级别禁用 Jackson 对 JSON 属性的自动发现。这将防止它试图处理Javassist的东西(并且失败)。@JsonAutoDetect

这意味着您必须手动注释每个 getter(使用 ),但这并不一定是一件坏事,因为它可以保持显式。@JsonProperty