1前書き

このチュートリアルでは、Spring __UriComponentsBuilderに焦点を当てます。具体的には、さまざまな実用的な実装例について説明します。

このビルダーは、

UriComponents

クラス(URIコンポーネントの不変のコンテナー)と連携して機能します。

新しい

UriComponentsBuilder

クラスは、構築、テンプレート変数からの展開、エンコードなど、URIの準備に関するあらゆる側面をきめ細かく制御することによって、

UriComponents

インスタンスを作成するのに役立ちます。


2 Mavenの依存関係

ビルダーを使用するには、

pom.xmlの

dependencies__に次のセクションを含める必要があります。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-web%22[here]にあります。

この依存関係はSpring Webのみを対象としているため、完全なWebアプリケーションには必ず<spring-context__>を追加してください。

もちろん、プロジェクトのロギングを設定する必要もあります。そのリンクについての詳細は/java-logging-intro[ここ]を参照してください。


3ユースケース


UriComponentsBuilder

には、対応するURIコンポーネントで許可されていない文字のコンテキストエンコーディングから始めて、URLの一部を動的に置き換えることまでを含む、実用的な使用例が数多くあります。


UriComponentsBuilder

の最大の利点の1つは、** それをコントローラメソッドに正しく挿入できることです。

@RequestMapping(method = RequestMethod.POST)
public ResponseEntity createCustomer(UriComponentsBuilder builder) {
   //implementation
}

有用な例を一つずつ説明していきましょう。すぐにJUnitフレームワークを使って実装をテストします。


3.1. URIを構築する

最も簡単なものから始めましょう。単純なリンクを作成するためだけに

UriComponentsBuilder

を使用します。

@Test
public void constructUri() {
    UriComponents uriComponents = UriComponentsBuilder.newInstance()
      .scheme("http").host("www.baeldung.com").path("/junit-5").build();

    assertEquals("/junit-5", uriComponents.toUriString());
}

ご覧のとおり、

UriComponentsBuilder

の新しいインスタンスを作成してから、スキーマタイプ、ホスト、および要求先へのパスを指定しました。

この単純な例は、私たちが私たちのウェブサイトの他の部分/リンクへのリダイレクトを実行したいときに役に立つかもしれません。


3.2. エンコードされたURI

の構築

単純なリンクを作成することに加えて、最終結果をエンコードすることもできます。実際に見てみましょう。

@Test
public void constructUriEncoded() {
    UriComponents uriComponents = UriComponentsBuilder.newInstance()
      .scheme("http").host("www.baeldung.com").path("/junit 5").build().encode();

    assertEquals("/junit%205", uriComponents.toUriString());
}

この例の違いは、単語

junit

と数字

5

の間にスペースを追加したいということです。

RFC 3986

によれば、それは不可能でしょう。


encode()

メソッドを使用して、有効な結果を得るためにリンクをエンコードする必要があります。


3.3. テンプレートからURIを構築する

URIテンプレートは、URIのほとんどのコンポーネントで使用できますが、その値は特定の要素に制限されています。これをテンプレートとして示します。明確にするために例を見てみましょう。

@Test
public void constructUriFromTemplate() {
    UriComponents uriComponents = UriComponentsBuilder.newInstance()
      .scheme("http").host("www.baeldung.com").path("/{article-name}")
      .buildAndExpand("junit-5");

    assertEquals("/junit-5", uriComponents.toUriString());
}

この例の違いは、パスの宣言方法と最終URIの作成方法にあります。キーワードに置き換えられるテンプレートは、

path()

メソッド内の角かっこ –

\ {…​}、

で示されます。最終リンクを生成するために使用されるキーワードは、

buildAndExpand(…​)

という名前のメソッドで使用されます。

置き換えられるキーワードが複数ある可能性があることに注意してください。

また、URIへのパスは相対パスでも構いません。

この例は、モデルオブジェクトをSpringコントローラに渡したいときにとても役立ちます。


3.4. クエリパラメータを使用したURIの構築

もう1つの非常に便利なケースは、クエリパラメータを使用してURIを作成することです。

URIクエリパラメータを指定するには、

UriComponentsBuilder



query()

を使用する必要があります。次の例を見てみましょう。

@Test
public void constructUriWithQueryParameter() {
    UriComponents uriComponents = UriComponentsBuilder.newInstance()
      .scheme("http").host("www.google.com")
      .path("/").query("q={keyword}").buildAndExpand("baeldung");

     assertEquals("http://www.google.com/?q=baeldung", uriComponents.toUriString());
}

クエリはリンクのメイン部分に追加されます。 __ \ {…​}のように角括弧を使用して、複数のクエリパラメータを指定できます。


UriComponentsBuilder

のこの実装は、たとえばREST API用のクエリ言語を構築するために使用される場合があります。


3.5. 正規表現でURIを拡張する

最後の例は、正規表現検証によるURIの構成を示しています。正規表現の検証が成功する場合にのみ、

uriComponents

を拡張できます。

@Test
public void expandWithRegexVar() {
    String template = "/myurl/{name:[a-z]{1,5}}/show";
    UriComponents uriComponents = UriComponentsBuilder.fromUriString(template)
      .build();
    uriComponents = uriComponents.expand(Collections.singletonMap("name", "test"));

    assertEquals("/myurl/test/show", uriComponents.getPath());
}

上記の例では、リンクの中央部分には

a-z

の文字と

1-5

の範囲の長さの文字だけを含める必要があることがわかります。

また、キーワード

name

を値

test

に置き換えるために

singletonMap

を使用しています。

この例は、ユーザーが動的にリンクを指定できるようにする場合に特に役立ちますが、有効なリンクのみがWebアプリケーションで機能するような種類のセキュリティを提供する必要があります。


4結論

このチュートリアルは

UriComponentsBuilder

の便利な例を紹介します。


UriComponentsBuilder

の主な利点は、URIテンプレート変数を使用できる柔軟性と、Spring Controllerのメソッドに直接注入できることです。

例と設定はすべてhttps://github.com/eugenp/tutorials/tree/master/spring-rest-simple[GitHub]から入手できます。