Jersey クライアント API を使用して、サードパーティの REST サービスを利用しようとしています。自動 POJO デシリアライゼーションを使用して、JSON 応答から Java オブジェクトに移行する予定です。
残念ながら、サード パーティ サービスは content type を使用して応答を返します"text/javascript"
。私のジャージー クライアントは、これを JSON オブジェクトと見なす必要があることを理解できず、オブジェクトのデシリアライズに失敗します。
簡単なジャージー サーバー アプリケーションを作成して、コンテンツ タイプを から"text/javascript"
に変更する"application/json"
ことで逆シリアル化が機能することを確認しました。
この情報を利用して、Jersey クライアント フィルターを使用して応答ヘッダーを変更することにしました。コードは、この質問の作成者によるコメントからのものです。実際、質問は私のものとまったく同じように見えますが、回答者は質問に誤って答え、 (応答ヘッダーではなく)要求ヘッダーを変更する方法を示しています。元の作成者はその回答を使用して解決策を作成できましたが、彼が述べた解決策は機能しないようです。
フィルタ コードは次のとおりです。
client.addFilter(new ClientFilter() {
@Override public ClientResponse handle(ClientRequest cr)
throws ClientHandlerException {
ClientResponse response = getNext().handle(cr);
response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
return response;
}
});
ただし、実行されると、 anUnsupportedOperationException
が発生します。
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.clear(Collections.java:1035)
at com.sun.jersey.core.util.StringKeyIgnoreCaseMultivaluedMap.putSingle(StringKeyIgnoreCaseMultivaluedMap.java:78)
at com.sun.jersey.core.util.StringKeyIgnoreCaseMultivaluedMap.putSingle(StringKeyIgnoreCaseMultivaluedMap.java:56)
at App$1.handle(App.java:49)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:507)
at App.main(App.java:63)
返されたヘッダーは、変更不可能なコレクションにラップされているように見えます。
次に、すべてのヘッダーを新しいコレクションにコピーしようとしましたが、ヘッダーのマップを応答に戻す方法がわかりません。
ClientResponse
最後に、修正したヘッダーを含む新しいを作成できるのではないかと考えました。ただし、コンストラクターにClientResponse
は次のシグネチャがあります。
public ClientResponse(int status,
InBoundHeaders headers,
InputStream entity,
MessageBodyWorkers workers)
status
、headers
およびentity
変数をオリジナルからコピーするのは簡単です。workers
ただし、フィールドへの参照を取得する方法がわかりません。
POJO デシリアライゼーションが機能するように、Jersey クライアント フィルターを使用して から"text/javascript"
への応答ヘッダーを変更するにはどうすればよいですか?"application/json"