在序列化Hibernate对象时引发奇怪的jacksonexception

jackson抛出一个怪异的例外,我不知道如何解决。 我使用Spring,Hibernate和Jackson。

我已经考虑过懒加载导致的问题,但我已经采取措施,告诉jackson不处理各种属性如下:

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

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

这是抛出的exception:

 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) 

关于如何获得更多信息的build议,看看是什么造成的? 谁知道怎么修它?

编辑:我发现代理对象上存在getHander()和其他get *()方法。 GRR! 有什么办法可以告诉jackson不要在代理上处理任何事情,或者我可以解决吗? 这真的很奇怪,因为在某些情况下,而不是所有的时间,吐出JSON的方法只会崩溃。 尽pipe如此,这是由于代理对象上的get()方法造成的。

旁白:代理是邪恶的。 他们扰乱了Jackson,equals()和其他常规Java编程的其他部分。 我试图完全抛弃Hibernate:/

这并不理想,但是您可以在课堂上使用@JsonAutoDetect禁用Jackson的JSON属性自动发现function。 这将阻止它试图处理Javassist的东西(和失败)。

这意味着你必须手动注解每个getter(使用@JsonProperty ),但这不一定是坏事,因为它使事情变得明确。

我有一个类似的问题,通过hibernate代理对象的延迟加载。 通过注释具有lazyloaded私有属性的类来解决它:

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

我假设你可以添加代理对象的属性,将JSON序列化分解为该注释。

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

我得到了同样的错误,但与Hibernate没有任何关系。 我在这里从所有可怕的build议,我猜在Hibernate和懒加载的情况下,这是相关的恐惧…但是,在我的情况下,我得到了错误,因为在一个内部类我没有getters / setter,所以BeanSerializer无法序列化数据…

添加getters和setters解决了这个问题。

对于它的价值, Jackson Hibernate模块项目刚刚开始,哪个应该解决这个问题,希望其他人也是如此。 项目与jackson项目有关,尽pipe不是核心来源的一部分。 这主要是为了允许更简单的发布过程; 它将需要jackson1.7,因为这是模块API被引入。

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

我有从spring的@RestController相同的错误消息。 我的rest控制器类是使用Spring的JpaRepository类,并通过replacerepository.getOne(id)方法调用问题已经消失。

你可以使用jackson-datatype-hibernate模块来解决这个问题。 它为我工作。 参考: https : //github.com/FasterXML/jackson-datatype-hibernate

我得到了同样的问题,在这里,致敬

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

http://blog.pastelstudios.com/2012/03/12/spring-3-1-hibernate-4-jackson-module-hibernate/

https://github.com/nessonqk/jackson-datatype-hibernate

您可以在类“Director”上使用@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" })注释,

类似于其他的答案,对我来说,问题是宣布一个多对一的列来做懒惰提取。 切换到渴望提取固定的问题。 之前:

 @ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.LAZY) 

后:

 @ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.EAGER) 

我是jacksonAPI的新手,当我得到了“org.codehaus.jackson.map.JsonMappingException:找不到类com.company.project.yourclass的序列化程序”时,我添加了getter和setter到com.company.project.yourclass ,这帮助我使用ObjectMapper的映射器对象将java对象写入一个平面文件。

我面临同样的问题,很奇怪的是,相同的代码在less数情况下工作,而在一些随机的情况下失败。

我通过确保正确的setter / getter(确保区分大小写)

我试过@JsonDetect

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

他们都没有为我工作。 使用第三方模块对我来说似乎是一个很大的工作。 所以我只是试着在传递给jackson进行serlization之前,先调用lazy对象的任何属性。 工作代码片段看起来像这样:

 @RequestMapping(value = "/authenticate", produces = "application/json; charset=utf-8") @ResponseBody @Transactional public Account authenticate(Principal principal) { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal; LoggedInUserDetails loggedInUserDetails = (LoggedInUserDetails) usernamePasswordAuthenticationToken.getPrincipal(); User user = userRepository.findOne(loggedInUserDetails.getUserId()); Account account = user.getAccount(); account.getFullName(); //Since, account is lazy giving it directly to jackson for serlization didn't worked & hence, this quick-fix. return account; } 

你也可以让你的域对象导演最终。 这不是完美的解决scheme,但它阻止了创build你的域类的代理子类。

您可以在Object.class上添加一个Jackson mixin,以便始终忽略与hibernate相关的属性。 如果你使用的是Spring Boot,把它放在你的Application类中:

 @Bean public Jackson2ObjectMapperBuilder jacksonBuilder() { Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder(); b.mixIn(Object.class, IgnoreHibernatePropertiesInJackson.class); return b; } @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) private abstract class IgnoreHibernatePropertiesInJackson{ }