序列化Hibernate对象时抛出奇怪的Jackson异常

ege*_*ari 61 java json hibernate spring-mvc jackson

杰克逊抛出一个奇怪的例外,我不知道如何解决.我正在使用Spring,Hibernate和Jackson.

我已经考虑过延迟加载会导致问题,但我已采取措施告诉Jackson不要处理各种属性,如下所示:

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" })
public class Director extends UserAccount implements EducationFacilityUser {
   ....
}
Run Code Online (Sandbox Code Playgroud)

我也为所有其他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)
Run Code Online (Sandbox Code Playgroud)

有关如何获取更多信息以查看导致此问题的建议?谁知道怎么修它?

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

旁白:代理是邪恶的.它们破坏了Jackson,equals()和常规Java编程的许多其他部分.我很想完全放弃Hibernate:/

Cla*_*ren 71

我通过hibernate代理对象进行延迟加载时遇到了类似的问题.通过使用以下方法注释具有lazyloaded私有属性的类来解决它:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Run Code Online (Sandbox Code Playgroud)

我假设您可以在代理对象上添加属性,将JSON序列化分解为该批注.

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

  • 在我的情况下,例外是一个懒惰的代理,但它是误导.从调试器中我看到,当它试图序列化一个名为`handler`的属性时抛出异常.当然,添加此注释会阻止jackson尝试序列化它.就在现场!非常感谢! (2认同)

ska*_*man 38

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

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

  • 您可以通过@JsonAutoDetect禁用Jackson Auto Discovery(fieldVisibility = JsonAutoDetect.Visibility.NONE,getterVisibility = JsonAudtoDetect.Visibility.NONE) (6认同)
  • @egervari:这就是未来之路,你知道,就像银色西装和机器人一样. (2认同)

Oha*_*adR 23

我得到了同样的错误,但与Hibernate无关.我从所有可怕的建议中得到了惊吓,我认为在Hibernate和延迟加载的情况下相关...但是,在我的情况下我得到了错误,因为在内部类我没有getter/setter,所以BeanSerializer无法序列化数据...

添加getter和setter解决了这个问题.

  • 我怎么可能做相反的事情?IE。我不想添加 getter/setter,但我希望 Jackson 跳过该属性。 (2认同)

Sta*_*Man 9

对于它的价值,杰克逊Hibernate模块项目刚刚开始,它应该解决这个问题,并希望其他人也是如此.项目与杰克逊项目有关,虽然不是核心资源的一部分.这主要是为了让发布过程更简单; 当模块API被引入时,它将需要Jackson 1.7.


小智 6

我有同样的问题.看看你是否正在使用hibernatesession.load().如果是这样,请尝试转换为hibernatesession.get().这解决了我的问题.


Rem*_*s B 5

我有春天的错误信息@RestController.我的休息控制器类使用spring的JpaRepository类,并且通过替换repository.getOne(id)方法调用repository.findOne(id)问题已经消失了.


riq*_*ang 5

与其他答案类似,我的问题是声明一个多对一的列来进行延迟获取。切换到急切获取解决了这个问题。前:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.LAZY)
Run Code Online (Sandbox Code Playgroud)

后:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.EAGER)
Run Code Online (Sandbox Code Playgroud)