5

私はRESTfulサービスにJSONを使用しており、(ペイロードキャリア形式として)JSONを使用しています。

私は@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class")インターフェースで使用していますIntA。クラスSuperClassはを実装しIntAます。MyClass拡張しますSuperClass

私が抱えている問題は少し奇妙です。スタンドアロンのメインプログラムを使用してクラスをシリアル化および逆シリアル化すると、完全に正常に機能します。しかし、戦争で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)

どんな助けでも大歓迎です。

4

2 に答える 2

7

これはクラスパスの問題のように聞こえます。つまり、Jacksonコードは、クラスローダーで名前付きクラスを見つけることができません。可能であれば、Jacksonとvalueクラスのjarがどこから来ているのかを確認し、それがそれを説明するかどうかを確認できます。残念ながら、クラスパスの問題はサーブレットコンテナのデプロイで非常に悪名高いものです。

于 2012-08-30T19:05:07.843 に答える
1

私の場合、この問題をどのように解決したか(これはあなたの場合とはまったく関係がない可能性があります):

    ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader( classLoader );
    try
    {
        invokeCodeThatPerformsSerializationDeserialization();
    }
    finally
    {
        Thread.currentThread().setContextClassLoader( oldClassLoader );
    }
于 2016-12-24T19:16:17.737 に答える