首页 文章

Jackson ( Jersey )反序列化异常 - (对于id类型'Id.class'):没有找到这样的类

提问于
浏览
2

我有一个基于Jersey的REST Web应用程序,并在OSGi容器中运行 - Geronimo3 . 该服务使用Json POST数据返回结果,并能够将json输出编组到java对象 . 我编写了一个REST客户端,并且使用main方法获取响应对象也可以正常工作 .

但是,Rest客户端在一个场景中失败 - 从OSGi Web应用程序中的Bundle Activator类调用时 . 在这种情况下,它给出了以下错误 . 此外,当Web应用程序完全初始化时,Rest客户端在请求范围内正常工作 . 我怀疑类加载器存在一些问题,因为OSGi类加载是不同的常规webapps(tomcat) . 响应类也使用@JsonTypeInfo注释将接口类型映射到具体类 .

Caused by: java.lang.IllegalArgumentException: Invalid type id     'com.nnn.IContentValue$ContentText' (for id type 'Id.class'): no such class found
at org.codehaus.jackson.map.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:57)
at org.codehaus.jackson.map.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:113)
at org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:82)
at org.codehaus.jackson.map.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:52)
at org.codehaus.jackson.map.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:321)
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:249)
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)

1 回答

  • 3

    我找到了一个我正在记录的解决方法 .

    它是由org.codehaus.jackson.map.util.ClassUtil.findClass从org.eclipse.core.runtime.internal.adaptor.ContextFinder加载typeid类引起的,该类与bundle init阶段的OSGi bundle classloader不同 .

    我在使用Thread.currentThread() . setContextClassLoader(getClass() . getClassLoader())之前替换了contextClassLoader,然后进行了jersey客户端调用并将其恢复为finally块中的原始调用 .

相关问题