37.2. クライアントとサーバー間でインターフェースを共有する
通常、 クライアントとサーバー間でインターフェースを共有することは可能です。 前述の例では、 JAX-RS サービスはアノテーションが付けられたインターフェースを実装し、 クライアント側で呼び出しを行うため同じインターフェースを再使用してクライアントプロキシを作成しなければなりませんでした。ただし、 JAX-RS メソッドが応答オブジェクトを返す時は制限されます。 raw 応答の戻しタイプ宣言ではクライアントにタイプ情報がないため問題が発生します。 この問題を回避する方法は 2 つあります。 1 つ目の方法は、
@ClientResponseType アノテーションを使用することです。
しかし、この方法では一部の
MessageBodyReader や MessageBodyWriter は要求の一致や対応にジェネリックタイプの情報が必要なため、動作しないことがあります。
この場合、 クライアントコードは返された応答オブジェクトを
ClientResponse へキャストし、 タイプされた getEntity() メソッドのうち 1 つを使用することができます。
MyInterface proxy = ProxyFactory.create(MyInterface.class, "http://localhost:8081"); ClientResponse response = (ClientResponse)proxy.getMyListOfJAXBObjects(); List<MyJaxbClass> list = response.getEntity(new GenericType<List<MyJaxbClass>>());
MyInterface proxy = ProxyFactory.create(MyInterface.class, "http://localhost:8081");
ClientResponse response = (ClientResponse)proxy.getMyListOfJAXBObjects();
List<MyJaxbClass> list = response.getEntity(new GenericType<List<MyJaxbClass>>());