2017-12-11 15 views
0

文字列リテラルtrueまたはfalseContent-Type: application/jsonヘッダーを返すWebサーバー上のエンドポイントがあります。私はこのエンドポイントにアクセスし、応答を単純な0​​に変換するJerseyクライアントを作成しようとしています。クライアントが要求を処理しようとするとカスタムプロバイダクラスを作成してJSONをブール値に変換するにはどうすればよいですか?

WebResource queryResource = client.resource("http://path.to/my/endpoint"); 
WebResource.Builder queryBuilder = queryResource.getRequestBuilder(); 
queryBuilder.addHeader("Authorization", "Bearer 1234..."); 
Boolean result = queryBuilder.get(new GenericType<Boolean>(){}); 

は、残念ながら、私はClientHandlerExceptionで終わると言う:

私のコードの関連部分は次のようになります

メッセージ本文Javaクラスjava.lang.Boolean、Javaタイプクラスjava.lang.Boolean、MIMEメディアタイプapplication/json。文字セット= UTF-8は

が見つかりませんでしたログ内のいくつかの詳細もこれを強調表示します:

The registered message body readers compatible with the MIME media type are: 
application/json; charset=UTF-8 -> 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App 
*/* -> 
    com.sun.jersey.core.impl.provider.entity.FormProvider 
    com.sun.jersey.core.impl.provider.entity.StringProvider 
    com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
    com.sun.jersey.core.impl.provider.entity.FileProvider 
    com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
    com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
    com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.ReaderProvider 
    com.sun.jersey.core.impl.provider.entity.DocumentProvider 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General 
    com.sun.jersey.core.impl.provider.entity.EntityHolderReader 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General 

私の最高の推測では、私ができる明示的にカスタム@Providerクラスのいくつかの種類を追加する必要があるということですapplication/jsonからBooleanへの変換を処理します。しかし、私はこれにはとても新しいし、前にプロバイダを書いたこともありません。私は人々のいくつかの例がJacksonJsonProviderに拡張されているのを見ましたが、他の用途のために。誰かが私に何をすべきかを示すか、このプロバイダをどのように書くことができるかについて私にいくつかのリソースを教えてもらえますか? (また、ジャージークライアントに追加する方法は?

答えて

0

application/jsonの場合はMessageBodyReaderを追加する必要があります。 Jersey Media Json Jacksonライブラリをプロジェクトに追加すると、この問題を簡単に解決することができます。あなたはMavenを使用する場合は、あなたのpom.xmlに次の依存関係を追加します。

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>${jersey.version}</version> 
</dependency> 

EDIT

カスタムMessageBodyReaderを実装する必要またはライブラリを追加しない最も簡単な解決策を文字列として手動応答からデータを読み込み、それを変換していますコンテンツタイプを使用すると、SHOアプリケーション/ JSONであればエーテルセンドA:boolean

 Client client = ClientBuilder.newClient(); 
     WebTarget webTarget = client.target("http://path.to/my/endpoint"); 
     Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); 
     Response response = invocationBuilder.get(); 
     Boolean result = Boolean.valueOf(response.readEntity(String.class)); 
0

に応答が有効なJSON文字列ではありませんuldは有効なjson文字列を受け取り、いくつかのDTOクラス(またはjavax.json.JsonObject)を取得します。

{"flag": true}.

またはコンテンツタイプをtext/plainに変更する必要があります。

関連する問題