私は今この問題に数日間苦労しており、これを解決する手掛かりはありません。クイックヘルプは感謝します。 LocalDateをApacheのCXFとjacksonを使用してRESTサービスビルドから受け取っているJSON文字列から変換する必要があります。カスタムContextResolverとMapperオブジェクトにJavaTimeModuleを登録しました。 アプリケーションを実行すると、デフォルトコンストラクタが呼び出されます。つまり、ロードされたことを意味しますが、ObjectMapperを呼び出すgetContext()メソッドは呼び出されません。CustomContextResolverのgetContext()メソッドがJacksonによって呼び出されていません
サーバーとクライアント側で同じContextResolverを登録しました。 すべての依存関係が存在します(jackson databind、core、annotation、datatype-jsr310)。
ブラウザでREST URIを直接押すとJSON応答を取得できます。クライアントコードから同じURI注釈付きメソッドを呼び出すと問題が発生する 以下はクライアントコードです。
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@Provider //makes this bean a Provider
public class LocalDateObjectMapperContextResolver implements ContextResolver<ObjectMapper>{
private final ObjectMapper MAPPER;
public LocalDateObjectMapperContextResolver() {
MAPPER = new ObjectMapper();
MAPPER.registerModule(new JavaTimeModule());
MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
<jaxrs:client id="testclient"
serviceClass="package1.RESTService"
username="abc"
password="abc"
address="$serviceURL">
<jaxrs:features>
<bean class="org.apache.cxf.transport.common.gzip.GZIPFeature"/>
<cxf:logging/>
</jaxrs:features>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="mypackage.LocalDateObjectMapperContextResolver"/>
</jaxrs:providers>
</jaxrs:client>
同じように、このcontextResolverも
<jaxrs:server>
.....
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="mypackage.LocalDateObjectMapperContextResolver"/>
</jaxrs:providers>
</jaxrs:server>
のgetContextが呼び出されない理由は、任意の理由の下に、サーバ側で登録されていますか?
また、ObjectMapperを拡張してjavaTimeModuleを登録してみましたが、customObjectMapperをJacksonのフローに登録する方法はわかりません。私はテストのためのデフォルトのコンストラクタを置くだけで、アプリケーションの起動時に呼び出されますが、再度、結果はありません、私はまだ同じエラーが発生します。
エラー:タイプが見つかりません、適切なコンストラクタ[単純型は、クラスがjava.time.LocalDate]:JSONオブジェクトからインスタンス化することはできません(タイプ情報を追加/有効にする必要がありますか?)
にすべての依存関係を移動したときに解決(別名バージョンからバージョン2とジャクソンjaxrsからジャクソンの依存関係を使用していましたv2.x)Jacksonライブラリ。あなたの 'ObjectMapper'は_is_v2のように見えますが、' JacksonJaxbJsonProvider'はv1( 'org.codehaus')です。 v2と互換性がありません。 v2の 'ObjectMapper'の' ContextResolver'を認識しません。 –
[ここをクリックしてください](https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider) –
私のプロジェクトはcodehausを使用しています。したがって、JacksonJaxbJsonProviderは他のサービスでも使用されます。つまり、Jackson2に移行せずにカスタムプロバイダ(fasterxmlから)を追加できないということですか? 私はいくつかのドキュメントを読んでいましたが、手動でカスタムプロバイダにモジュールを登録することをお勧めします JavaTimeModule(jsr-310)をJackson1.xに登録することは可能ですか? – Surinder