1. 序章

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

ビルダーは、 UriComponents クラス(URIコンポーネントの不変コンテナー)と連携して動作します。

新しいUriComponentsBuilderクラスは、構築、テンプレート変数からの拡張、エンコードなど、URIの準備のすべての側面をきめ細かく制御できるようにすることで、UriComponentsインスタンスの作成に役立ちます。

2. Mavenの依存関係

Builderを使用するには、pom.xmldependenciesに次のセクションを含める必要があります。

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

最新バージョンはここにあります。

この依存関係はSpringWebのみを対象としているため、完全なWebアプリケーションにはspring-contextを追加することを忘れないでください。

もちろん、プロジェクトのロギングも設定する必要があります。詳細については、こちらをご覧ください。

3. ユースケース

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

UriComponentsBuilder の最大の利点の1つは、コントローラーメソッドに直接挿入できることです。

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

有用な例を1つずつ説明していきましょう。 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 の新しいインスタンスを作成してから、スキームタイプ、ホスト、およびリクエストの宛先へのパスを指定しました。

この簡単な例は、Webサイトの他の部分/リンクへのリダイレクトを実行する場合に役立つことがあります。

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へのパスは相対的である可能性があります。

この例は、URIを構築するためのベースとなるSpringControllerにモデルオブジェクトを渡したい場合に非常に役立ちます。

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

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

UriComponentsBuilderquery()を使用して、URIクエリパラメーターを指定する必要があります。 次の例を見てみましょう。

@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());
}

クエリはリンクの主要部分に追加されます。 角かっこを使用して、複数のクエリパラメータを提供できます {…}。 それらは、という名前のメソッドのキーワードに置き換えられます buildAndExpand(…)

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

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());
}

上記の例では、リンクの中央部分に az からの文字と、 1〜5の範囲の長さが必要であることがわかります。

また、 singletonMap を使用して、キーワードnameを値testに置き換えています。

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

4. 結論

このチュートリアルでは、UriComponentsBuilderの便利な例を紹介します。

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

すべての例と構成は、ここGitHubで入手できます。