Rest Jackson(jersey)反序列化异常-(对于id类型';id.class';):未找到此类类

Rest Jackson(jersey)反序列化异常-(对于id类型';id.class';):未找到此类类,rest,serialization,jersey,osgi,jackson,Rest,Serialization,Jersey,Osgi,Jackson,我有一个基于Jersey的RESTWeb应用程序,运行在OSGi容器Geronimo3中。该服务使用Json POST数据返回结果,并且能够将Json输出封送到java对象。我已经编写了一个REST客户机,它在主方法返回响应对象时也可以正常工作。 但是,有一种情况下,Rest客户端失败——从OSGi web应用程序中的Bundle Activator类调用。在这种情况下,它给出了以下错误。 另外,当web应用程序完全初始化时,Rest客户机在请求范围内工作正常。我怀疑类加载器存在一些问题,因为O

我有一个基于Jersey的RESTWeb应用程序,运行在OSGi容器Geronimo3中。该服务使用Json POST数据返回结果,并且能够将Json输出封送到java对象。我已经编写了一个REST客户机,它在主方法返回响应对象时也可以正常工作。

但是,有一种情况下,Rest客户端失败——从OSGi web应用程序中的Bundle Activator类调用。在这种情况下,它给出了以下错误。 另外,当web应用程序完全初始化时,Rest客户机在请求范围内工作正常。我怀疑类加载器存在一些问题,因为OSGi类加载器与常规Web应用程序(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)

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

这是由于org.codehaus.jackson.map.util.ClassUtil.findClass从org.eclipse.core.runtime.internal.adapter.ContextFinder加载typeid类导致的,该类在bundle init阶段不同于OSGi bundle classloader

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