【问题标题】:Jackson (jersey) deserialize exception - (for id type 'Id.class'): no such class foundJackson (jersey) 反序列化异常 - (for id type 'Id.class'): no such class found
【发布时间】:2013-11-10 18:35:41
【问题描述】:

我有一个基于 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)

【问题讨论】:

    标签: rest serialization jersey osgi jackson


    【解决方案1】:

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

    这是由于 org.codehaus.jackson.map.util.ClassUtil.findClass 在 bundle init 阶段从 org.eclipse.core.runtime.internal.adaptor.ContextFinder 加载 typeid 类,这与 OSGi 捆绑类加载器不同。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2017-03-05
      • 2017-06-12
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多