2

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

但是,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)
4

1 回答 1

3

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

这是由于 org.codehaus.jackson.map.util.ClassUtil.findClass 在包初始化阶段从 org.eclipse.core.runtime.internal.adaptor.ContextFinder 加载 typeid 类与 OSGi 包类加载器不同。

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

于 2013-10-31T20:32:11.173 回答