簡體   English   中英

序列化Hibernate對象時拋出奇怪的Jackson異常

[英]Strange Jackson exception being thrown when serializing Hibernate object

傑克遜拋出一個奇怪的例外,我不知道如何解決。 我正在使用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 *()方法。 GRR! 有什么辦法我可以告訴傑克遜不要在代理上處理任何事情,或者我是誰? 這真的很奇怪,因為吐出JSON的方法只會在某些情況下崩潰,而不是一直崩潰。 盡管如此,這是由於代理對象上的get *()方法。

旁白:代理是邪惡的。 它們破壞了Jackson,equals()和常規Java編程的許多其他部分。 我很想完全放棄Hibernate:/

我通過hibernate代理對象進行延遲加載時遇到了類似的問題。 通過使用以下方法注釋具有lazyloaded私有屬性的類來解決它:

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

我假設您可以在代理對象上添加屬性,將JSON序列化分解為該批注。

避免對未獲取的惰性對象進行Jackson序列化

這不是理想的,但您可以在類級別使用@JsonAutoDetect禁用Jackson的JSON屬性自動發現。 這可以防止它試圖處理Javassist的東西(並失敗)。

這意味着您必須手動注釋每個getter(使用@JsonProperty ),但這不一定是壞事,因為它可以保持顯式。

我得到了同樣的錯誤,但與Hibernate無關。 我從所有可怕的建議中得到了驚嚇,我認為在Hibernate和延遲加載的情況下相關...但是,在我的情況下我得到了錯誤,因為在內部類我沒有getter / setter,所以BeanSerializer無法序列化數據...

添加getter和setter解決了這個問題。

對於它的價值, 傑克遜Hibernate模塊項目剛剛開始,它應該解決這個問題,並希望其他人也是如此。 項目與傑克遜項目有關,雖然不是核心資源的一部分。 這主要是為了讓發布過程更簡單; 當模塊API被引入時,它將需要Jackson 1.7。

我有同樣的問題。 看看你是否正在使用hibernatesession.load() 如果是這樣,請嘗試轉換為hibernatesession.get() 這解決了我的問題。

我從spring的@RestController得到了同樣的錯誤信息。 我休息控制器類是使用Spring的JpaRepository類,並通過更換repository.getOne(id)與方法調用repository.findOne(id)的問題就消失了。

您可以使用jackson-datatype-hibernate模塊來解決此問題。 它對我有用。 參考: https//github.com/FasterXML/jackson-datatype-hibernate

與其他答案類似,我的問題是聲明多對一列進行延遲提取。 切換到急切提取修復了問題。 之前:

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

后:

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

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

您可以在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{ }

我是Jackson API的新手,當我得到“org.codehaus.jackson.map.JsonMappingException:沒有為類com.company.project.yourclass找到序列化程序”時,我將getter和setter添加到com.company.project.yourclass ,這幫助我使用ObjectMapper的mapper對象將java對象寫入平面文件。

我遇到了同樣的問題,同樣的代碼在少數情況下工作,而在某些隨機情況下失敗,這真的很奇怪。

我通過確保正確的setter / getter(確保區分大小寫)來解決問題

我試過@JsonDetect

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

他們都沒有為我工作。 使用第三方模塊對我來說似乎很多工作。 所以我只是嘗試對懶惰對象的任何屬性進行get調用,然后再傳遞給jackson進行serlization。 工作代碼片段看起來像這樣:

@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;
    }

您也可以將您的域對象Director設為final。 它不是完美的解決方案,但它阻止創建域類的代理子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM