Java 6インターフェイス MultivaluedMap ?
インターフェイスは「Java」に属していません。つまり、インターフェイスはコアライブラリの一部ではありません。これは、 JAX-RS 仕様の一部であるjavax.ws.rs
階層の一部です。 Jersey などの仕様を実装するフレームワークで使用されます。これは、マップが単一の値だけでなく、任意の数の値を参照する必要がある場合に使用されます。使用例としては、たとえば、キーごとに複数の値を追加したいリクエストヘッダーのストレージがあります。または、null
値と比較して、空のリストを処理する方が簡単な場合でも、キーがありません。
このHTTPヘッダーを例にとってみましょう。
Accept-Encoding:compress; q = 0.5、gzip; q = 1.0
これをモデル化する
MultivaluedMap<String, String> map = ...
map.add("Accept-Encoding", "compress;q=0.5");
map.add("Accept-Encoding", "gzip;q=1.0");
ジャージーの内部。このタイプの複数値ストレージは、Javaの一般的な問題であり、 Guava などの他のマップの実装者によって対処されます。
これは基本的にjavadocが言うことです:
キーと値のペアのマップ。各キーは0個以上の値を持つことができます。
そのキーと値のペアのマップ。各キーはゼロまたは複数の値を持つことができます
public interface MultivaluedMap<K,V> extends Java.util.Map<K,Java.util.List<V>>
MultivaluedMapの適切な使用法は、UriInfoを使用することです。複数のQueryParamを取り込むRESTエンドポイントを記述している場合、UriInfoを使用してすべてのパラメーターを取得し、getQuery()呼び出しを使用してそれらを抽出できます。例:
public void get(@Context UriInfo ui) {
MultivaluedMap params = ui.getRequestUri().getQuery();
// now do what you want with your params
}
MultivaluedMapは、複数の値を持つパラメーターを持つことができるので便利です。たとえば、それが顧客データベースであり、複数の顧客を取得したい場合、マップには「customerID」のキーとそれにリンクされたいくつかの値があります。
MultiValuedMapは、CoreJavaではなくjavax.ws.rs.coreパッケージの一部です。これは主に、リクエストでヘッダー値を保存して使用するために使用されています
private MediaType getMediaType(Class entityClass、Type entityType、MultivaluedMap headers){final Object mediaTypeHeader = headers.getFirst( "Content-Type"); ....}
また、UriInfoでは非常に便利です
private String getJsonpFunctionName(){
UriInfo uriInfo = getUriInfo();
if (uriInfo == null) {
return null;
}
MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
if (queryParameters == null) {
return null;
}
return queryParameters.getFirst("jsonp");
}