2016-07-03 13 views
0

私は今この問題に数日間苦労しており、これを解決する手掛かりはありません。クイックヘルプは感謝します。 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オブジェクトからインスタンス化することはできません(タイプ情報を追加/有効にする必要がありますか?)

+1

にすべての依存関係を移動したときに解決(別名バージョンからバージョン2とジャクソンjaxrsからジャクソンの依存関係を使用していましたv2.x)Jacksonライブラリ。あなたの 'ObjectMapper'は_is_v2のように見えますが、' JacksonJaxbJsonProvider'はv1( 'org.codehaus')です。 v2と互換性がありません。 v2の 'ObjectMapper'の' ContextResolver'を認識しません。 –

+0

[ここをクリックしてください](https://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider) –

+0

私のプロジェクトはcodehausを使用しています。したがって、JacksonJaxbJsonProviderは他のサービスでも使用されます。つまり、Jackson2に移行せずにカスタムプロバイダ(fasterxmlから)を追加できないということですか? 私はいくつかのドキュメントを読んでいましたが、手動でカスタムプロバイダにモジュールを登録することをお勧めします JavaTimeModule(jsr-310)をJackson1.xに登録することは可能ですか? – Surinder

答えて

0

あなたはMavenのあなたを使用している場合次の2つの依存関係を追加できます。

 <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.datatype</groupId> 
      <artifactId>jackson-datatype-jdk8</artifactId> 
     </dependency> 

さらに、次のコードスニペットを追加してください。

@Configuration 
public class CxfConfig { 

    @Component 
    @javax.ws.rs.ext.Provider 
    public static class JacksonJaxbJsonProvider 
      extends com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider { 

     @Autowired 
     private ObjectMapper objectMapper; 

     @PostConstruct 
     public void init() { 

      objectMapper.registerModule(new Jdk8Module()); 

     } 

    } 
} 
+0

ちょっとありがとうカスタムDeserialiserでやったことがありましたが、私は、fasterxmlからjavaTimeModuleを追加する必要はありませんでした。以下は私のコードです(リンクをたどる)。誰かを助けることを願っています http://www.coderanch.com/t/667353/tools/Java-LocalDate-Jackson-format#3114957 – Surinder

0

私はまったく同じ問題を@peeskilletが質問のコメントで説明しました。

私は1

すべてのバージョンより新しい `com.fastrerxml`を使用する必要があります。2.

関連する問題