web-dev-qa-db-ja.com

cxf jax-rs2.0クライアントのjacksonjsonプロバイダーを登録する方法は?

単純なGETリクエストを行うJAX-RSクライアントがあります。私はCXF実装とSpringforDIを使用しています。呼び出しは成功し、200の応答コードが返されます。しかし、応答をPOJOに読み込むときにエラーが発生します。

例外:

_[2015-05-08 16:11:55,457][ERROR][org.Apache.cxf.jaxrs.utils.JAXRSUtils]: No message body reader has been found for class com.voya.refapp.domain.Customer, ContentType: application/json
[2015-05-08 16:11:55,468][ERROR][com.voya.refapp.service.CustomerServiceImpl]: filterByName() - Exception occurred
javax.ws.rs.client.ResponseProcessingException: No message body reader has been found for class com.voya.refapp.domain.Customer, ContentType: application/json
    at org.Apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.Java:433) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4]
    at org.Apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.Java:384) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4]
_

コード:

_Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/rest").path("customers/1");
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE);
Response response = builder.get();  // Successful
Customer customer = response.readEntity(Customer.class);  // Fails
_

クラスパスの この回答 で提案されているように、以下の依存関係がありますが、自動的に取得されないようです。

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

また、クライアントを作成するときにjsonプロバイダーを登録してみました。

_Client client = ClientBuilder.newClient().register(new JacsksonJsonProvider());
_

そして

_Client client = ClientBuilder.newClient().register(JacsksonJsonProvider.class);
_

しかし、これらのオプションはどれも機能しませんでした。上記のオプションのいずれかを使用してjsonプロバイダーを登録すると、別の例外が発生しました。

_javax.ws.rs.client.ResponseProcessingException: Problem with reading the data
_

更新:

Jsonプロバイダーの登録は、ClientBuilder.newClient().register(JacsksonJsonProvider.class)を使用して正常に機能しました。問題はデータにありました(上記の例外のように明確に述べています..今はばかげています:()。jsonに「active」という名前のブールフィールドがありましたが、POJOでは「isActive」と呼ばれていました。 POJOのフィールドへの注釈@JsonProperty("active")、正常に動作し始めました

11
Anand Jayabalan

AFAIK CXFは 自動検出をサポートしていませんMessageBodyReaderクラスを実行します。ただし、手動でJacksonJsonProviderを登録すると効果的です。

確認してください 私の例 これは完全に機能します。それはあなたのものとほとんどまったく同じです、私はただ異なるサービスを使いました。たぶん、あなたのバージョンが正しく動作するのを妨げる違いを見つけることができます。

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);
WebTarget target = client.target("http://jsonplaceholder.typicode.com").path("posts/1");
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE);
Response response = builder.get();  // Successful
Post post = response.readEntity(Post.class);
13
Dawid Pytel