2012-08-30 48 views
4

我爲我的RESTful服務使用JSON,並且我有JSON(作爲有效載荷格式)。我在IntA上使用@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class")SuperClass類實現IntAMyClass延伸SuperClass傑克遜1.8.5(對於JSON)不反序列化:「找不到此類」

我遇到的問題有點奇怪。當我使用獨立主程序對我的類進行序列化和反序列化時,它工作得很好。然而,當我在戰爭中部署在Tomcat和我嘗試反序列化,它說沒有這樣的類中找到

堆棧跟蹤:

Caused by: java.lang.IllegalArgumentException: Invalid type id 'com.abc.xyz.MyClass' (for id type 'Id.class'): no such class found 
     at org.codehaus.jackson.map.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:55) 
     at org.codehaus.jackson.map.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:77) 
     at org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:67) 
     at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeWithType(BeanDeserializer.java:423) 
     at org.codehaus.jackson.map.deser.StdDeserializerProvider$WrappedDeserializer.deserialize(StdDeserializerProvider.java:460) 
     at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2376) 
     at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1166) 
     at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410) 
     at org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:447) 

任何幫助是極大的讚賞。

回答

7

這聽起來像是一個類路徑問題:即,Jackson代碼無法使用其類加載程序找到指定的類。如果可能的話,也許你可以看到傑克遜和價值班的罐子來自哪裏,看看這是否能解釋它。不幸的是,類路徑問題在servlet容器部署上相當臭名昭着。

+0

感謝您的答覆。我已經手動檢查過這個班是否在戰爭中。當我嘗試執行Thread.currentThread()。getClassLoader()。loadClass(「com.abc.xyz.MyClass」)時,它失敗。但是,當我嘗試Class.forName(「com.abc.xyz.MyClass」)它加載罰款。這是問題嗎?如果是這樣,我該如何解決這個問題? – Chris

+0

通常通過移動其中一個jar或試圖重新配置servlet容器的類加載優先級(它確定哪些類可見)。通常發生的情況是像傑克遜這樣的庫被app容器的類加載器加載,並且來自webapp:former的值類無法看到後者。 – StaxMan

1

如何解決在我的情況下,這個問題(這可能是完全無關,你的情況):

ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); 
    Thread.currentThread().setContextClassLoader(classLoader); 
    try 
    { 
     invokeCodeThatPerformsSerializationDeserialization(); 
    } 
    finally 
    { 
     Thread.currentThread().setContextClassLoader(oldClassLoader); 
    }