14.7. MicroProfile Rest Client

14.7.1. 概要

MicroProfile Rest ClientはJAX-RS Client APIを拡張した機能を提供します。
MicroProfile Rest Clientの@RestClient、@RegisterRestClientのようなアノテーションを使って定義することで、容易にMicroProfile Rest Clientを作成できます。また、型や名前を誤った場合、アノテーションの定義により、より厳密に事前にコンパイルエラーとして検出することができます。

MicroProfile Rest Client アプリケーションはJAX-RS アプリケーションを呼び出す形になります。双方のアプリケーションは同一環境に配備しても別環境に配備しても実行可能です。

MicroProfile Rest Client 構成図

本製品では Eclipse MicroProfile Rest Client V2.0をサポートしています。JAX-RS のベースは2.1となります。
詳細は以下を参照してください。
Rest Client for MicroProfile

14.7.2. MicroProfile Rest Client アプリケーションの作成方法の違いによる特徴

MicroProfile Rest Client アプリケーションの作成方法には、CDIを使用する方法と、CDIを使用しない方法があります。また、一部機能にはどちらにも属さない作成方法があります。作成方法の違いによる特徴は以下のようになります。
14.7.2.1. CDIを使用する場合
アノテーションを使って定義することで、容易にアプリケーションを作成することができます。
また、JAX-RS アプリケーションに接続するためのベースURL/URIを、プロパティファイル(microprofile-config.properties)に記述することで、warファイルを作成した後でも、再ビルドせずにベースURL/URIの変更が可能です。
14.7.2.2. CDIを使用しない場合
CDIを使用する場合と比べてコードは冗長になりますが、テスト中などCDIが使えない場面でも利用可能です。
しかし、JAX-RS アプリケーションに接続するためのベースURL/URIをソースに記述するため、ベースURL/URIの変更が必要な場合は再ビルドが必要です。

Memo
どちらにも属さないプロバイダクラス登録方法
独自に作成したプロバイダクラスの登録方法は、上記にそれぞれ存在しますが、それとは別に、プロバイダ構成ファイルにプロバイダクラス名を記載し、サービスローダによりロードさせる方法があります。これには登録方法をソースに記載しないという利点があります。上記それぞれでの登録方法の代わりに使用することができます。


14.7.3. 提供機能

MicroProfile Rest Client では、以下のような機能を提供します。
14.7.3.1. MicroProfile Rest Client の提供アノテーション
CDIを使用してアプリケーションを作成するために、次のアノテーションを提供します。

名称 必須 説明 アノテーション名
プロパティ必須 プロパティ名 プロパティ説明
ClientHeaderParam - HTTPリクエストヘッダを設定します。 @ClientHeaderParam
name HTTPヘッダ名を設定します。
value HTTPヘッダ値を設定します。固定値だけでなく、取得メソッドを設定することもできます。取得メソッドを使用する場合は下記の条件を満たす必要があります。
  • アノテーションにメソッドを設定する場合、メソッド名を{}で囲んでください。
  • クライアントのインタフェースのデフォルトメソッドまたは別クラスのpublic staticメソッドとして取得メソッドを定義してください。
  • 取得メソッドはStringまたはString[]を返してください。
インタフェースに定義する例)
@ClientHeaderParam(name=HttpHeaders.CONTENT_LANGUAGE, value="{getLanguage}")
String contentLang(String subject);

default String getLanguage() {
  return ...;
}
- required HTTPヘッダ値を取得するメソッドが例外を投げた場合に要求を中止する(true:デフォルト)か、単にこのHTTPヘッダをスキップするか(false)を設定します。falseに設定した時に例外が発生した場合、クライアント要求は続行するが、このアノテーションで設定したHTTPヘッダは送信されません。
RegisterClientHeaders - HTTPリクエストヘッダを更新します。デフォルトのプロパティを使用した場合、 org.eclipse.microprofile.rest.client.propagateHeaders構成プロパティに記載されたすべてのヘッダが更新されます。 @RegisterClientHeaders
- value ClientHeadersFactoryインタフェースの実装クラスを設定します。(デフォルト:DefaultClientHeadersFactoryImpl)
RegisterRestClient このアノテーションをCDI管理Beanとして管理されるインタフェースに付与します。 @RegisterRestClient
- baseUri microprofile-config.propertiesでベースURIを設定する代わりにプロパティでベースURIを設定することができます。
例)
@RegisterRestClient(baseUri="http://localhost:8080/sample")
public interface RestClientInterface {
- configKey microprofile-config.propertiesに定義する際、完全修飾クラス名の代わりにconfigKeyの設定値を使用できます。
例)
@RegisterRestClient(configKey="myClient")
public interface RestClientInterface {

microprofile-config.properties内部
myClient/mp-rest/url=http://localhost:8080/sample
RestClient CDIでインジェクトしたクラスをMicroProfile Rest Clientとしてインスタンス化します。 @RestClient
RegisterProvider - 独自に作成したプロバイダクラスを登録するようにMicroProfile Rest Client実装コードに指示します。
例)
@RegisterProvider(CustomExceptionMapper.class)
public interface RestClientInterface {
@RegisterProvider

上記以外に、JAX-RSで使用されるアノテーションも使用できます。そのうち、MicroProfile Rest Client でCDIを使用する場合に必須となるアノテーションは以下の通りです。

名称 説明 アノテーション名
Path 詳細は[Webサービスアプリケーション > プログラミング・開発ガイド > RESTful Webサービス > URIテンプレート]を参照してください。 @Path
Inject CDI管理Beanをインジェクトします。 @Inject

下記はJAX-RSでも使用されるアノテーションで、MicroProfile Rest Client では任意で使用可能です。ただし、MicroProfile Rest Client ではJAX-RSの場合とは異なるMIMEタイプのデフォルト値が設定されています。JAX-RSのデフォルト値は"application/octet-stream"です。
名称 説明 デフォルト アノテーション名
Consumes リソースが受け付けるMIMEタイプを指定します。 application/json @Consumes
Produces リソースから返されるMIMEタイプを指定します。 application/json @Produces

CDIの対象とするために、スコープアノテーションかbeans.xmlのどちらかを定義する必要があります。
スコープアノテーションの種類は次の通りです。これらはJAX-RSでも使われています。
名称 スコープのライフサイクル アノテーション名
Dependent インジェクト先のBeanのライフサイクルに準ずる。デフォルト。 @Dependent
RequestScoped 1リクエストの間 @RequestScoped
SessionScoped 1セッションの間 @SessionScoped
ApplicationScoped アプリケーションの開始から終了まで @ApplicationScoped
ConversationScoped リクエスト以上セッション以下の範囲で、開始・終了をアプリケーションで明示する。 @ConversationScoped

beans.xmlはWEB-INF配下に配置します。
beans.xml 配置図

beans.xmlの記述内容は以下の通りです。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>
    
このうち、設定項目は bean-discovery-mode で、設定値は以下の通りです。
annotated を設定した場合、結局スコープアノテーションも付与する必要があります。
設定値 説明
annotated スコープアノテーションが付与されたクラスのみを CDI管理Beanとする。
all クラスパス上の全てのクラスをCDI Beanとする。スコープアノテーションがないクラスは@Dependentが付与されているとみなす。
none 全てのクラスを CDI Beanとしない。


Caution
上記でスコープアノテーションを付与する方法を採用した場合、次の注意点があります。
スコープアノテーションを省略した場合、@Dependentアノテーションがデフォルトとなります。
一方、beans.xmlがない場合、bean-discovery-mode属性のデフォルト値はannotatedとなります。annotatedはスコープアノテーションが付与されたクラスのみを CDI管理Beanとします。したがって、対象クラスをCDI管理Beanとしたい場合は、スコープアノテーションを明示する必要があります。


14.7.3.2. ベースURL/URI(※)の設定
[リファレンス > 設定 > マイクロサービスアプリケーション > MicroProfile Rest Client > MicroProfile Rest Client 設定項目一覧] の「インターフェースの完全修飾名 + "/mp-rest/" + "url" または"uri"」を参照してください。
microprofile-config.properties はMicroProfile Configの機能を使うための設定ファイルです。詳細は[MicroProfile Config]をご確認ください。microprofile-config.properties を使わずに設定する方法もあります。
14.7.3.3. HTTPヘッダの更新
HTTPリクエストヘッダをアプリケーションの中で更新することができます。org.eclipse.microprofile.rest.client.ext.ClientHeadersFactoryインタフェースを実装することで更新できます。
作成したクラスは[@RegisterClientHeadersアノテーション]に指定することで使用されます。@RegisterClientHeadersアノテーションにクラスを指定しない場合、デフォルト値の org.eclipse.microprofile.rest.client.ext.DefaultClientHeadersFactoryImpl が使用されます。デフォルトクラスを使用した場合、microprofile-config.propertiesのorg.eclipse.microprofile.rest.client.propagateHeadersプロパティに記載されたすべてのヘッダが更新されます。個々のヘッダ名はカンマ区切りで記載されています。
14.7.3.4. RestClientBuilder APIの提供メソッド
CDIを使用せずにアプリケーションを作成するために、次の機能を提供します。
なお、すべてRestClientBuilder API(org.eclipse.microprofile.rest.client.RestClientBuilder)のメソッドであり、戻り値はすべてRestClientBuilderになります。
RestClientBuilder APIの他のメソッドを実行する前に、まずnewBuilderメソッドを実行してインスタンスを生成してください。最後にbuildメソッドを実行し、その間にその他メソッドを実行してください。例はCDI未使用時の[ルートリソースクラスの作成]を参照してください。
メソッド名 必須 引数 説明
newBuilder - RestClientBuilder APIのインスタンスを生成します。
baseUrl(baseUri) ベースURL(URI)(※) JAX-RS アプリケーションにアクセスするためのベースURL(URI)(※)を指定します。CDIを使用する場合のmicroprofile-config.propertiesの設定に該当します。
connectTimeout - (long)待機する最大時間,
(java.util.concurrent.TimeUnit)単位
JAX-RS APへの接続を待機するためのタイムアウトを指定します。
executorService - ExecutorServiceの独自実装クラス 非同期処理でExecutorServiceを独自実装する場合に指定します。
followRedirects - (boolean)HTTPリダイレクト応答に従うかどうか。従う:true、従わない:false MicroProfile Rest Clientインスタンスは、デフォルトではリダイレクト応答(HTTPステータスコード300番台)に自動的には従いません。リダイレクト応答に自動的に従うようにするには、trueを設定する必要があります。
hostnameVerifier - (javax.net.ssl.HostnameVerifier)カスタムクラス URLのホスト名とサーバの識別ホスト名の不一致で失敗するSSL接続を許可するかどうかを設定します。
keyStore - (java.security.KeyStore)キーストア,
(String)キーストアパスワード
クライアント側のキー ストアを指定します。
property - (String)プロパティ名,
(Object)値
新しいプロパティを設定したり、既存のプロパティ値を変更したりします。
proxyAddress - (String)プロキシホスト名/IPアドレス,
(int)プロキシポート番号
クライアント インスタンスからのリクエストに使用する HTTPプロキシのホスト名/IP アドレスとポートを指定します。
queryParamStyle - (org.eclipse.microprofile.rest.client.ext.QueryParamStyle)クエリパラメータスタイル(列挙型) 1つのクエリパラメータに対して、複数の値を持つ場合、送信する際のクエリパラメータのフォーマットを指定します。指定可能なクエリパラメータスタイルは次の3種類があります。
  • QueryParamStyle.ARRAY_PAIRS:値が配列の場合に指定します。例: foo[]=v1&foo[]=v2&foo[]=v3
  • QueryParamStyle.COMMA_SEPARATED:値をカンマ区切りにしたい場合に指定します。例: foo=v1,v2,v3
  • QueryParamStyle.MULTI_PAIRS:デフォルトのスタイルで、キーと値をそれぞれ"="で結びつけます。例: foo=v1&foot=v2&foo=v3
使用例は[クエリパラメータ コレクションのフォーマット指定]を参照してください。
readTimeout - (long)待機する最大時間,
(java.util.concurrent.TimeUnit)単位
JAX-RS APからの応答を待機するためのタイムアウトを指定します。
register - プロバイダクラス 独自に作成したプロバイダクラスを指定します。CDIを使用する場合の@RegisterProviderアノテーションに該当します。
sslContext - (javax.net.ssl.SSLContext)SSLコンテキスト MicroProfile Rest ClientアプリからJAX-RSアプリにSSLでアクセスする際に使用する、SSLコンテキストを指定します。
trustStore - (java.security.KeyStore)トラストストア クライアント側のトラストストアを設定します。デフォルトではJVMのトラストストアを使用しますが、カスタムのトラストストアを設定して使用することができます。その場合、トラストストアをKeyStoreオブジェクトで読み込み、trustStore()メソッドに引数で渡す必要があります。
例)
KeyStore trustStore = readTrustStore();
RestClientBuilder.newBuilder()
        .trustStore(trustStore)
build MicroProfile Rest Clientインターフェース 実装するインターフェースを指定し、クライアントをインスタンス化します。

CDIを使用しない場合でもJAX-RSで使用されるアノテーションを使用できます。必須は@Pathアノテーションのみです。
14.7.3.5. クエリパラメータ コレクションのフォーマット指定
MicroProfile Rest Clientインタフェースでは、@QueryParamアノテーションを使用して、クエリパラメータを指定することができます。その際、RestClientBuilder.queryParamStyle()メソッドにEnumのorg.eclipse.microprofile.rest.client.ext.QueryParamStyleを引数に渡すことで、複数の値を持つクエリパラメータに対してフォーマットを指定することができます。指定可能なフォーマットについては[RestClientBuilder APIの提供メソッド]のqueryParamStyleを参照してください。
QueryParamStyle.COMMA_SEPARATEDを使用する例を下記に提示します。
public interface QueryClient {
    Response sendMultiValues(@QueryParam("myParam") List<String> values);
}
QueryClient client = RestClientBuilder.newBuilder()
                                      .baseUri(someUri)
                                      .queryParamStyle(QueryParamStyle.COMMA_SEPARATED)
                                      .build(QueryClient.class);
Response response = client.sendMultiValues(Collections.asList("abc", "mno", "xyz"));
上記の設定により、"myParam=abc,mno,xyz"という形式でHTTPリクエストのクエリパラメータが生成されます。
14.7.3.6. サービスローダの設定
独自に作成したプロバイダクラスを登録する方法として、上記で@RegisterProviderアノテーションを使う方法と、RestClientBuilder APIのregisterメソッドを使う方法を記載しましたが、代わりに下記の方法を取ることもできます。
下記の方法を使用する場合は、@RegisterProviderアノテーションやRestClientBuilder APIのregisterメソッドで同じプロバイダクラスを指定しないでください。
  1. org.eclipse.microprofile.rest.client.spi.RestClientBuilderListenerまたはRestClientListenerインターフェースを実装します。
  2. META-INF/services ディレクトリ配下に org.eclipse.microprofile.rest.client.spi.RestClientBuilderListener(RestClientListener) ファイル(プロバイダ構成ファイル)を作成します。
  3. 上記ファイルに、RestClientBuilderListener(RestClientListener)インターフェース実装クラスの完全修飾クラス名を記載します。
    その際、文字コードをUTF-8にします。
後はアプリケーションを配備することで、サービスローダによりロードされます。
14.7.3.7. 独自例外Mapperクラスの作成
org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapperインターフェースを実装することで、JAX-RS アプリケーションからのレスポンスと例外クラスの対応付けを行うことができます。
ResponseExceptionMapperインターフェースには次のメソッドがあります。
メソッド名 引数 戻り値 説明
getPriority - int 独自例外Mapperクラスの優先順位を返します。
handles (int)HTTPステータスコード
(javax.ws.rs.core.MultivaluedMap<String, Object>)ヘッダー
boolean レスポンスのHTTPステータスコードやヘッダーの内容により、独自例外Mapperクラスで扱うかどうかを返します。
toThrowable (javax.ws.rs.core.Response)レスポンス 例外インスタンス handlesメソッドの条件に該当するレスポンスの内容に基づき、例外レスポンスを返します。

独自例外Mapperクラスの実装例を記載します。この例では、HTTPステータスコードに対応する例外インスタンスを返しています。
CustomUnknownUrlException、CustomConfrictDataExceptionは独自例外クラス、CustomBaseExceptionはその親クラスという例ですが、既存の例外クラスも指定できます。
@Provider
public class CustomExceptionMapper implements ResponseExceptionMapper<CustomBaseException> {
    @Override
    public boolean handles(int status, MultivaluedMap<String, Object> headers) {
        return status == 404 || status == 409;
    }
    
    @Override
    public CustomBaseException toThrowable(Response response) {
        switch (response) {
            case 404:
                return new CustomUnknownUrlException();
            case 409:
                return new CustomConfrictDataException();
        }
        return null;
    }
}

独自例外Mapperクラスは、例で@Providerアノテーションを使っていることからもわかる通り、独自のプロバイダクラスに該当します。登録方法は、[MicroProfile Rest Client の提供アノテーション]の@RegisterProviderアノテーション、[RestClientBuilder APIの提供メソッド]のregisterメソッド、[サービスローダの設定]のいずれかの方法で行ってください。
14.7.3.8. デフォルト例外Mapper
デフォルト例外Mapperは、レスポンスのHTTPステータスコードが400以上の場合にWebApplicationExceptionを返します。ただし、独自例外Mapperクラスが優先され、独自例外Mapperクラスで条件に一致しない場合にデフォルト例外Mapperが実行されます。
デフォルト例外Mapperはデフォルトで有効になっていますが、無効にする方法もあります。次のどちらかの方法を行ってください。
14.7.3.9. 非同期処理
Rest Clientインタフェースメソッドを非同期的に宣言することができます。標準のJAX-RSでは非同期処理のための別スレッド管理の仕組みがないため、スレッド管理機構としてConcurrency Utilities for Java EEを利用します。
非同期メソッドを宣言する場合、戻り値の型はjava.util.concurrent.CompletionStageを利用します。
public interface CustomAsyncClient {
    @GET
    public CompletionStage<Response> getAsync();
}
返却されたCompletionStageは、CompletableFuture型に変換することで、処理結果をget()メソッドで取得できます。型変換はCompletionStage#toCompletableFuture()メソッドを使用します。
get()メソッドは、非同期で実行されている処理が終わるまで呼び出し元のスレッドをブロックして待ちます。
CompletableFuture<Response> future = customAsyncClient.getAsync().toCompletableFuture();
Response res = future.get();

非同期メソッドは、呼び出し元のスレッドとは異なるスレッドで実行をスケジュールすることによって、非同期になります。MicroProfile Rest Client の実装には、これを行うための既定の手段がありますが、RestClientBuilder.executorService() は、アプリケーション固有の ExecutorService を置き換える方法を提供します。

org.eclipse.microprofile.rest.client.extパッケージのAsyncInvocationInterceptorFactoryとAsyncInvocationInterceptorは、呼び出しスレッドと非同期スレッド間の通信手段を提供します。どちらもインタフェースのため、実装が必要です。
各メソッドは次のタイミングで実行されます。
  1. AsyncInvocationInterceptorFactory.newInterceptor()でAsyncInvocationInterceptorインタフェースのインスタンスを取得します。
  2. AsyncInvocationInterceptor.prepareContext()は呼び出しスレッドで実行され、リクエスト実行時に使用される情報を格納します。
  3. AsyncInvocationInterceptor.applyContext()は非同期処理開始後、非同期スレッドで実行されます。
  4. インターセプタやフィルタなど、関連するインバウンド プロバイダが非同期スレッドで実行されます。
  5. AsyncInvocationInterceptor.removeContext()で、制御をユーザに戻す前に、すべてのコンテキストを削除します。
14.7.3.10. SSLサポート
[RestClientBuilder APIの提供メソッド]にも記載していますが、SSLの使用をサポートするメソッドを提供しています。関連メソッドは以下になります。
sslContextを除き、これらはmicroprofile-config.propertiesに定義することもできます。[リファレンス > 設定 > マイクロサービスアプリケーション > MicroProfile Rest Client > MicroProfile Rest Client 設定項目一覧]を参照してください。
14.7.3.11. Server Sent Eventsサポート
HTTP5仕様ではServer Sent Events(SSE) が導入され、HTTPサーバがイベントを HTTPクライアントにプッシュできるようになりました。MicroProfile Rest Clientインタフェースでは、@Produces(MediaType.SERVER_SENT_EVENTS)アノテーションを付与し、 org.reactivestreams.Publisher<?>型を返すメソッドを定義します。下記に実装例を記載します。
public interface MySseClient {
    @GET
    @Path("ssetest")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher<InboundSseEvent> getEvents();
}
呼出しメソッド
public void testSseClient() {
    MySseClient client = RestClientBuilder.newBuilder().baseUri(someUri).build(MySseClient.class);
    Publisher<InboundSseEvent> publisher = client.getEvents();
    publisher.subscribe(new Subscriber<InboundSseEvent>(){ ... });
14.7.3.12. MicroProfile Rest Clientのライフサイクル
MicroProfile Rest Clientのインスタンスにはオープンとクローズの2つの状態があります。@RestClientアノテーションやRestClientBuilder APIのbuild()でインスタンスが生成された時にオープンとなりますが、クローズは明示的に行うことが期待されています。クローズ処理を行っていないRest Clientアプリケーションを配備後、配備解除やドメイン停止をした場合、次のメッセージが出力されます。
INFO     MICROPROFILE - OTX31070045: Closing a class org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine instance for you. Please close clients yourself.
クローズ処理の例を記載します。
  1. Rest Clientインタフェースでjava.lang.AutoCloseableを継承します。
    public interface SimpleRestClient extends AutoCloseable {
  2. Rest Clientインタフェースの呼出し元で、呼出したメソッドをリソース付きtry文(try-with-resources)で囲みます。リソース付きtry文を使うことで、close()メソッドを呼び出さなくても、try文を抜ける時にクローズされます。
    public class SimpleRestEndpoint {
        @Inject
        @RestClient
        SimpleRestClient client;
        
        @GET
        @Path(value = "{id}")
        public Customer getCustomerList(@PathParam(value = "id") String id) {
            Customer custom = null;
            try (SimpleRestClient c = client) {
                custom = c.getCustomerList(id);
            } catch (Exception e) {
                e.printStackTrace();
           }
            return custom;
        }
    
14.7.3.13. ※ベースURL/URIとは
MicroProfile Rest Client アプリケーションからJAX-RS アプリケーションにアクセスするために、MicroProfile Rest Client アプリケーションで、JAX-RS アプリケーションの基本となるURL/URIを指定します。この基本となるURL/URIのことをベースURL/URIと言います。
JAX-RS アプリケーションに "http://localhost/Hello/name_list/0001" のようなURLでアクセスする場合、"name_list" がJAX-RS アプリケーションクラスの@Pathアノテーションで定義されているとすると、ベースURL/URIは "http://localhost/Hello" になります。

14.7.4. XMLで通信するMicroProfile Rest Client アプリケーションの作成

ここでは、CDIを使用してアプリケーションを作成する方法と、CDIを使用せずにアプリケーションを作成する方法を紹介します。
[Webサービスアプリケーション > チュートリアル > RESTful Webサービスの作成 > XMLで通信するRESTful Webサービスの作成]で作成されたJAX-RS アプリケーションにアクセスするMicroProfile Rest Client アプリケーションの作成方法について説明します。事前にJAX-RS アプリケーションを作成しておいてください。
14.7.4.1. MicroProfile Rest Client アプリケーション作成(CDI使用)
(サンプルプロジェクト RestClientXML.zip)
MicroProfile Rest Clientプロジェクトの作成
[Webサービスアプリケーション > チュートリアル > RESTful Webサービスの作成 > XMLで通信するRESTful Webサービスの作成 > RESTful Webサービスプロジェクトの作成] と同じ手順でプロジェクトを作成します。この例ではプロジェクト名を以下のように指定します。
項目
プロジェクト名 RestClientXML
Customerクラスのコピー
Developer上でRestSampleXMLプロジェクトのsample.resourceのCustomer.javaをパッケージごと、RestClientXMLプロジェクトのsrcフォルダにコピーします。
インターフェースの作成
RestClientXMLプロジェクトで右クリック > 新規 > インターフェースを選択し、パッケージsample.restclientに、RestClientInterfaceというインターフェースを作成します。
作成されたRestClientInterfaceインターフェースをエディタで開いて、以下の太字部分の内容を追加し、保存します。
package sample.restclient;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import sample.resource.Customer;

@RegisterRestClient
public interface RestClientInterface extends AutoCloseable {
    public Customer getCustomerList(String id);
}
クラス名RestClientInterfaceを選択し、注釈プロパティービューでアノテーション@Pathを追加し、そのvalue属性の値を"/name_list"に設定します。value属性の値はJAX-RS アプリケーションでクラスに設定した@Pathのvalue属性の値と同じ内容を設定します。

RestClientInterfaceインターフェース 注釈プロパティビュー アノテーション追加

同様の方法で、getCustomerListメソッドにアノテーション@Produces(value = { "application/xml" })@GET@Path(value = "{id}")を追加し、パラメーターidにアノテーション@PathParam(value = "id")を追加します。
package sample.restclient;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import sample.resource.Customer;

@Path(value = "/name_list")
@RegisterRestClient
public interface RestClientInterface extends AutoCloseable {
    @Produces(value = { "application/xml" })
    @GET
    @Path(value = "{id}")
    public Customer getCustomerList(@PathParam(value = "id") String id);
}
ルートリソースクラスの作成
RestClientXMLプロジェクトで右クリック > 新規 > クラスを選択し、パッケージsample.restclientに、RestClientResourceというクラスを作成します。
作成されたRestClientResourceクラスをエディタで開いて、以下の太字部分の内容を追加し、保存します。
package sample.restclient;

import org.eclipse.microprofile.rest.client.inject.RestClient;

import sample.resource.Customer;

public class RestClientResource {
    
    @RestClient
    RestClientInterface client;

    public Customer getCustomerList(String id) {
        Customer custom = null;
        try (RestClientInterface c = client) {
            custom = c.getCustomerList(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return custom;
    }
}
RestClientInterfaceの場合と同様に、注釈プロパティービューを使い、以下のようにアノテーションを追加します。
package sample.restclient;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.inject.RestClient;

import sample.resource.Customer;

@Path("client")
@RequestScoped
public class RestClientResource {
    
    @Inject
    @RestClient
    RestClientInterface client;

    @Produces(value = { "application/xml" })
    @GET
    @Path(value = "{id}")
    public Customer getCustomerList(@PathParam(value = "id") String id) {
        Customer custom = null;
        try (RestClientInterface c = client) {
            custom = c.getCustomerList(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return custom;
    }
}
web.xml にリソースクラスを指定
web.xmlに以下のコードを追加します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>RestClientXML</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>sample.restclient.RestClientResource</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>
microprofile-config.propertiesの作成
RestClientXMLプロジェクトで右クリック > 新規 > フォルダーを選択し、srcフォルダー配下にMETA-INFの名称で作成します。フォルダー名と作成場所は固定です。
RestClientXMLプロジェクトで右クリック > 新規 > ファイルを選択し、src/META-INFフォルダー配下にmicroprofile-config.propertiesの名称で作成します。ファイル名と作成場所は固定です。

新規ファイル

microprofile-config_propertiesをエディタで開いて、以下の形式で1行追加します。
インターフェースの完全修飾名 + "/mp-rest/" + "url" または"uri"=JAX-RS アプリケーションのベースURL/URI

Caution
microprofile-config_propertiesへの記述はSourceタブで行ってください。Propertiesタブに記述すると、ベースURL/URIに意図せずエスケープ文字が追加され、正しいURL/URIとして認識されなくなります。

プロパティファイル

ここまでで、CDIを使用するMicroProfile Rest Client アプリケーションの作成が完了しました。
アプリケーションのデプロイ
作成したMicroProfile Rest Client アプリケーションをアーカイブしてサーバに配備します。[Webサービスアプリケーション > チュートリアル > Webサービスのデプロイ > WARファイルを作成します]を参照してください。その際、Webプロジェクト名はRestClientXMLにします。
JAX-RS アプリケーションも同様にサーバに配備します。
アプリケーションの実行
MicroProfile Rest Client アプリケーションにWebブラウザでアクセスします。
http://localhost/{アプリケーション名}/client/{id}

http://localhost/RestClientXML/client/0001にアクセスすると、 id0001のコンシューマの氏名が表示されます。

idが0001のブラウザ表示結果


14.7.4.2. MicroProfile Rest Client アプリケーション作成(CDI未使用)
(サンプルプロジェクト RestClientXMLByBuilder.zip)
MicroProfile Rest Clientプロジェクトの作成
[Webサービスアプリケーション > チュートリアル > RESTful Webサービスの作成 > XMLで通信するRESTful Webサービスの作成 > RESTful Webサービスプロジェクトの作成] と同じ手順でプロジェクトを作成します。この例ではプロジェクト名を以下のように指定します。
項目
プロジェクト名 RestClientXMLByBuilder
Customerクラスのコピー
Developer上でRestSampleXMLプロジェクトのsample.resourceのCustomer.javaをパッケージごと、RestClientXMLByBuilderプロジェクトのsrcフォルダにコピーします。
インターフェースの作成
CDI使用時の[RestClientInterfaceインターフェースの作成]を参照してください。ただし、アノテーション@RegisterRestClientは追加しません。
ルートリソースクラスの作成
RestClientXMLByBuilderプロジェクトで右クリック > 新規 > クラスを選択し、パッケージsample.restclientに、RestClientResourceというクラスを作成します。
作成されたRestClientResourceクラスをエディタで開いて、以下の太字部分の内容を追加し、保存します。
URLにはJAX-RS アプリケーションのベースURLを指定します。
package sample.restclient;

import java.net.URL;

import org.eclipse.microprofile.rest.client.RestClientBuilder;

import sample.resource.Customer;

public class RestClientResource {
    public Customer getCustomerList(String id) {
        URL apUrl = null;
        try {
            apUrl = new URL("http://localhost/RestSampleXML");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        RestClientInterface client = RestClientBuilder.newBuilder()
                                                      .baseUrl(apUrl)
                                                      .build(RestClientInterface.class);
        Customer custom = null;
        try (RestClientInterface c = client) {
            custom = c.getCustomerList(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return custom;
    }
}
    
CDI使用時の[ルートリソースクラスの作成]を参照して、注釈プロパティービューを使い、アノテーションを追加してください。
ただし、@RequestScoped@Injectは追加しません。
package sample.restclient;

import java.net.URL;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.RestClientBuilder;

import sample.resource.Customer;

@Path(value = "client")
public class RestClientResource {
    @Produces(value = { "application/xml" })
    @GET
    @Path(value = "{id}")
    public Customer getCustomerList(@PathParam(value = "id") String id) {
        URL apUrl = null;
        try {
            apUrl = new URL("http://localhost/RestSampleXML");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        RestClientInterface client = RestClientBuilder.newBuilder()
                                                      .baseUrl(apUrl)
                                                      .build(RestClientInterface.class);
        Customer custom = null;
        try (RestClientInterface c = client) {
            custom = c.getCustomerList(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return custom;
    }
}
    
web.xml にリソースクラスを指定
CDI使用時の[web.xml にリソースクラスを指定]を参照してください。

ここまでで、CDIを使用しないMicroProfile Rest Client アプリケーションの作成が完了しました。
アプリケーションのデプロイ
作成したMicroProfile Rest Client アプリケーションをアーカイブしてサーバに配備します。「Webサービスアプリケーション > チュートリアル > Webサービスのデプロイ > WARファイルを作成します」を参照してください。その際、Webプロジェクト名はRestClientXMLByBuilderにします。
JAX-RS アプリケーションも同様にサーバに配備します。
アプリケーションの実行
MicroProfile Rest Client アプリケーションにWebブラウザでアクセスします。
http://localhost/{アプリケーション名}/client/{id}

http://localhost/RestClientXMLByBuilder/client/0001にアクセスすると、 id0001のコンシューマの氏名が表示されます。

idが0001のブラウザ表示結果


14.7.5. JSONで通信するMicroProfile Rest Client アプリケーションの作成

[Webサービスアプリケーション > チュートリアル > RESTful Webサービスの作成 > JSONで通信するRESTful Webサービスの作成]で作成されたJAX-RS アプリケーションにアクセスするMicroProfile Rest Client アプリケーションの作成方法について説明します。事前にJAX-RS アプリケーションを作成しておいてください。

基本的に[Webサービスアプリケーション > チュートリアル > RESTful Webサービスの作成 > JSONで通信するRESTful Webサービスの作成]と同じで、上記の[XMLで通信するMicroProfile Rest Client アプリケーションの作成]のRestClientInterfaceインターフェース、CustomerResourceクラスの @Produces("application/xml") を @Produces("application/json") に変更するたけで、JSONで通信するMicroProfile Rest Client アプリケーションに変更できます。

RestClientInterfaceインターフェース
package sample.restclient;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import sample.resource.Customer;

@Path(value = "/name_list")
@RegisterRestClient
public interface RestClientInterface extends AutoCloseable {
    @Produces(value = { "application/json" })
    @GET
    @Path(value = "{id}")
    public Customer getCustomerList(@PathParam(value = "id") String id);
}
    
CustomerResourceクラス
package sample.restclient;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.inject.RestClient;

import sample.resource.Customer;

@Path("/client")
@RequestScoped
public class RestClientResource {
    
    @Inject
    @RestClient
    RestClientInterface client;

    @Produces(value = { "application/json" })
    @GET
    @Path(value = "{id}")
    public Customer getCustomerList(@PathParam(value = "id") String id) {
        Customer custom = null;
        try (RestClientInterface c = client) {
            custom = c.getCustomerList(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return custom;
    }
}