Restサービスの呼び出し方法

Jerseyで、Restサービスの呼び出し方法に関して、まだ書いてなかったので、書いておこうと思います。
この場合もレスポンスとして、XMLが戻ってくる場合は、基本的にJAXBで、XMLJavaクラスにバインドします。
まず、呼び出しを行うWebResourceオブジェクトを生成します。
WebResourceオブジェクトの生成には、手順があります。
最初にClientクラスのオブジェクトが必要になります。
Clinetクラスは、createメソッドでClientクラスのオブジェクトを取得することができます。
createメソッドは、引数として、ClientConfigクラスのオブジェクトが必要です。
例としては、下記の様にClientクラスのオブジェクトを取得します。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);

取得したClientクラスのオブジェクトを使いWebResourceクラスのオブジェクトを取得します。
ClientクラスにあるresourceメソッドからWebResourceクラスのオブジェクトを取得できます。
resorceメソッドは、引数として、UriBuilderクラスを利用して、Restサービスの呼び出しURLをbuildしたオブジェクトが必要です。
例としては、下記の様にWebResourceクラスのオブジェクトを取得します。

String url = "http://localhost/rest/Message/service/getMessage";
WebResource resource = client.resource(UriBuilder.fromUri(url).build());

WebResourceクラスのオブジェクトができれば、呼び出しを行うことが可能になります。
呼び出しを行うURLに「messageId=100」みたなクエリーパラメータが必要な場合があると思います。
その場合は、WebResourceクラスのqueryParamメソッドかqueryParamsメソッドを使います。
クエリーパラメータが一つしかない場合は、queryParamメソッドを使い、複数ある場合は、queryParamsメソッドを使います。
また、XMLなのかJSONなのか、どの形式で戻ってくるか指定する必要があります。
これもWebResourceクラスのacceptメソッドに形式を指定します。
MediaTypeクラスに定数が定義してあり、XMLの場合、TEXT_XML_TYPEになります。
最後に、JAXBのクラスをgetメソッドに指定して呼び出しを行います。
呼び出し例は、下記の記述になります。

MessageResponse response = resource.queryParam("messageId", 100).accept(MediaType.TEXT_XML_TYPE).get(MessageResponse.class);

ちなみに、サービス側で、例外が発生した場合もXML形式で例外内容が戻ってくる場合に関してもJAXBでバインドすることが可能です。
HTTPステータスコードが400の場合、ApplicationFault、500の場合、SystemFaultとして、それ用のXMLで戻ってくるようなサービスとして、
Restサービスを組んである場合は、
呼び出し側で、HTTPステータスコードが400の場合JAXBで生成したApplicationFaultクラスにバインドしたり、500の場合は、SystemFaultクラスにバインドしたりできます。
サービス側で、例外が発生した場合は、WebResourceクラスは、UniformInterfaceExceptionがスローされます。
その例外をキャッチして、JAXBにバインドします。
バインドするには、まず何が戻ってきているかを確認する必要があります。
HTTPステータスコードを確認して、どのJAXBクラスにバンドするかを決めます。
HTTPステータスコードを確認するには、UniformInterfaceExceptionからResponseクラスのオブジェクトを取得して、getStatusメソッドで判断します。
HTTPステータスコードがわかったら、ResponseクラスのgetEntityメソッドにJAXBクラスを指定すればXMLをJAXBクラスへバインドすることができます。
下記の様に記述します。

try {
      MessageResponse response = resource.queryParam("messageId", 100).accept(MediaType.TEXT_XML_TYPE).get(MessageResponse.class);
} catch (UniformInterfaceException ex) {
      if (ex.getResponse().getStatus() == 400) {
        ApplicationFault fault = ex.getResponse.getEntity(ApplicationFault.class);
        // なんらかの例外処理
      } else if (ex.getResponse.getStatus() == 500) {
        SystemFault fault = ex.getResponse.getEntity(SystemFault.class);
        // なんらかの例外処理
      }
}