IntelliJ IDEA News Tips & Tricks

Spring / Spring Boot 開発のための IntelliJ IDEA 便利機能(後編)

こんにちは、JetBrains堀岡です。

この記事は「IntelliJ IDEA Spring Tips & Tricks From The Trenches(Marco Behler, 2021)」をベースにした IntelliJ IDEA Ultimate版Community版との比較 の Spring / Spring Boot 開発支援機能を体験するための日本語ハンズオンの後編です。

前編の記事は以下をご覧ください。

Spring 開発のための IntelliJ IDEA 便利機能(前編)

目次

Rest Controller のテスト(Http クライアント、エンドポイント一覧機能の紹介)

まずは REST API の動作確認やテストに活用できる、IDE 上で簡単に実行可能な HTTP クライアント機能を紹介します。

Rest Controller のサンプルコードを書きながら IntelliJ IDEA の便利機能を見ていきましょう。動画(英語)はこちらです。

前回のハンズオンのプロジェクトに 以下のUserController というクラスを作成し、GET リクエストのエンドポイントを作成します。

UserController.java

package com.example.ibj20spring;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users")
    public List<User> users() {
        return userService.getUsers();
    }
}

次に IDE上で Spring Boot アプリケーションを実行します。以下のいずれかで可能です。

  • プロジェクトツールウィンドウで Ibj20springApplication.java ファイルを右クリックし、実行 Ijb20springApplication を選択

または、

  • 画面上部の実行構成ダイアログで「Ibj20springApplication」が選択されていることを確認し、▶︎ボタンをクリックします(または メニューの 実行 | 実行… から「Ibj20springApplication」を選択して実行可能です)

または、

  • Ibj20springApplicationクラスまたは main メソッドの▶︎ガターアイコンをクリックしても実行することができます。

画面下部の「実行」ツールウィンドウで Spring Boot アプリケーションが問題なく起動したことを確認します。

REST API の動作を確認するためには、ブラウザやPostman等のIDE外のツールで応答を確認する方も多いと思いますが、IntellIJ IDEA でも直接確認することが可能です。いくつかの方法がありますので、順番に見ていきましょう。

  • UserController クラスで @GetMapping で指定されたエンドポイントである users メソッドに表示されているガターアイコンをクリックします
  • ポップアップが表示されるので「HTTP リクエストの実行」をクリックします

HTTP リクエストが実行され、その結果が以下のように「サービス」ツールウィンドウ内に表示されます。このように「HTTP リクエストの実行」機能は REST コントローラーのエンドポイントを気軽に実行して結果を確認するために使用することができます。

次の機能「HTTP クライアントでリクエストを生成」を見てみましょう。

  • 先ほどの「HTTP リクエストの実行」機能と同様に、UserService クラスの users メソッドのガターアイコンをクリックします
  • 今度は「HTTP クライアントでリクエストを生成」を選択します
  • スクラッチファイルとして、.http ファイルが生成されます。.http ファイルは IntelliJ IDEA の HTTP クライアントが実行するファイルで、テストのための HTTP リクエストとその実行結果が記録されます。
  • 以下の例では users メソッドが提供するエンドポイントに対する、GET リクエストが生成されています。
  • .http ファイルのシンタックス にあるように様々なリクエストの実行が可能です。動画(英語)では IDE による様々なリクエスト作成支援機能を紹介しています。

  • HTTP リクエスト左に表示される▶︎ガターアイコンをクリック、または Option + Enter/Alt + Enter で HTTP リクエストを実行できます。

  • 実行結果は、「HTTP サービスリクエストの実行」同様にサービスツールウィンドウに表示されます。また、レスポンス出力が .idea/httpRequests/ 以下に保存されます。
  • 以下の例では json ファイルが保存されます。
  • 以下の例では、2021-09-23T215915.200.json ファイルに対して Cmd + B / Ctrl + B (定義ジャンプ)を実行すると、保存された出力結果を確認することができます。

複数回実行すると、結果は別々に保存されます。この時に、出力ファイル左のガターアイコンをクリックして出力結果を比較することも可能です。

.http ファイルにテストするリクエストを追加したい場合は、.httpファイル上部の「リクエストの追加」から行うことができます。または、HTTP リクエストファイルは ### をリクエストの区切りとして、テストしたい URL を追記していくことことが可能です。

なお、.http リクエストファイルはスクラッチファイルとして生成されるため、デフォルトではVCS(Git等)による管理対象外です。テストケースとして管理対象としたい場合は、

  • .http ファイルを選択して リファクタリング | 移動(または F6)で、適切な場所に移動させておきましょう。

次に「エンドポイント一覧機能」 を見ていきます。そのために、UserController.java にエンドポイントを追加してもう少し複雑にしてみます(コード自体にはあまり意味はないのですが、IntelliJ IDEA がコードをどのように解釈するか理解するためのものです)。英語による解説動画はこちらです。

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users")
    public List<User> users() {
        return userService.getUsers();
    }

    //以下を追加
    @GetMapping("/admins")
    public List<User> admins() {
        new RestTemplate().getForObject("http://localhost:8080/users", User.class);
        return userService.getUsers();
    }
}

ここで、@GetMapping(“/users”) エンドポイントをクリックして、「モジュールの全てのエンドポイントを表示」を選択してみましょう。

以下のように、モジュール内で定義、または使用されているすべてのエンドポイントが表示されます。

複雑なサービスで提供、利用しているタイプが多い場合、エンドポイントのタイプ(サーバー、クライアント)を絞り込むことも可能です。

最後にちょっとした豆知識です。Shift x 2 (どこでも検索/Search Everywhere)で、エンドポイントのURLを検索すると、エンドポイントを実装してくれるメソッドを表示してくれます。

HTML templates(Thymeleaf)

さて次は HTML template(Thymeleafサポート)について紹介します。

英語の動画はこちらからご覧いただけます。

src/main/resources/templates 以下に home.html ファイルを追加します。Thymeleaf サポートを利用するために重要な点は、Thymeleaf のネームスペース属性(xmlns:th=”http://www.thymeleaf.org)を追加することです。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>

次に Java コードとして WebController を追加します。以下のコードをコピペするのではなく、ライブコーディングの様子(英語) を見てコードを書いてみることをお勧めします。

src/main/java/com/example/ibj20spring/WebController.java

package com.example.ibj20spring;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class WebController {

    public WebController(UserService userService) {
        this.userService = userService;
    }

    private final UserService userService;

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("users", userService.getUsers());
        return "home";
    }
}

home メソッドを記述する際、戻り値としてテンプレート名を指定する必要がありますが、IntelliJ IDEA は先ほど作成した home.html を認識しているので、以下のようにテンプレート名の自動補完(ctrl + Space)が可能です。

次にテンプレート(home.html)に戻ってコードを追加していきましょう。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- 以下を追加 -->
<p>Welcome:</p>
<ul>
    <li th:each="u : ${users}"><span th:text="${u.name}">[name]</span></li>
</ul>

</body>
</html>

コードを追加する際に着目してもらいたいポイントは、th:text のような Thymeleaf 属性や u.name のような Java クラスへの自動補完や(間違った名前を指定している場合)エラーハイライト効くということです。

次に、以下のように ${users} からモデル属性のキー名を変更してみましょう。動画(英語)はこちらです。

  • home.html を開きます。
  • ${users} にカーソルを当てます
  • リファクタリング – 名前の変更(Shift + F6)を実行します
  • users を userz に変更します。
  • (場合によっては)変更箇所のプレビュー画面が表示されます。「リファクタリング実行」ボタンをクリックします。

  • ${userz} の箇所で定義ジャンプ(cmd + B / ctrl + B)を実行し、WebController.java を表示し、コントローラー側でモデル属性をセットしている箇所のコードが「model.addAttribute(“userz”,…」となっていることを確認します。

IntelliJ IDEA は ビューである HTML テンプレート側とコントローラーの関係を把握しているため、属性キーのリファクタリングも一括して行うことが可能です。

このように IntelliJ IDEA Ultimate 版では、Spring 関連のフレームワークサポート機能により、自動補完やリファクタリング、定義ジャンプ等の便利機能は Java コードだけでなく、HTMLテンプレートを利用した箇所でも動作可能です。

Spring 関連のツールウィンドウ

最後に Spring 関連のツールウィンドウを紹介します。英語の動画はこちらです。

実行(Run) ツールウィンドウ内の Spring Boot Actuator

Maven 等でプロジェクトの依存関係に Spring Actuator が指定されている場合、Run ツールウィンドウで Spring Boot Actuator にアクセスすることが出来ます。

Bean タブではアプリケーションにロードされている ランタイムBean 一覧を確認できます。黄色がかっているものは Spring Boot で自動的に構成されたもの、黄色がかっていないものはユーザーが定義した(UserController, UserService, WebController 等自分で追加した) Bean です。Bean をクリックするとソースにジャンプすることができます。また右側で Bean 同士の依存関係をみることも出来ます。

ヘルス(状態)タブでは Health 情報を確認することができます。

マッピングタブでは、エンドポイント一覧を確認することができます。Bean タブ同様、黄色がかっているものは、Spring Boot により自動的に構成されたもの、そうではないもの(/admin や /users)は自分で追加したエンドポイントです。

以下に示すように、ツールウィンドウ左側のアイコンで /actuator/xxx のようなライブラリエンドポイントの表示・非表示の切り替えが可能です。

Spring ツールウィンドウ

次に紹介するのは Spring ツールウィンドウです。複雑な Spring アプリケーションの構成を確認したいときに役立ちます。Spring ツールウィンドウには Bean, MVC, データの3つのタブがありますので、どのような機能があるか見ていきましょう。

Bean タブでは、アプリケーションごとの Bean 一覧を確認できるという点においては、先ほど紹介した Spring Actuator と同じです(ただし、Spring Actuator は実行ツールウィンドウ機能の一部なので、実行中の情報を取得しているという点において違います)。Bean を選択すると以下のように、Bean の依存関係ダイアグラムを表示することができます。ダイアグラムのノードをクリックすると該当する Bean クラスファイルにジャンプすることができます。

MVC タブでは、コントローラー一覧および、コントローラー内のエンドポイント一覧を確認することができます。

最後は データ タブです。ここでは Spring Data Bean 一覧が表示されます。例として、以下の Interface を追加してみましょう。ライブコーディングの様子(英語)はこちらです。

UserRepository.java

package com.example.ijb20spring;

import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface UserRepository extends CrudRepository<User, Long> {

    @Query("select * from Users")
    public List<User> customSelect();

}

コードを追加すると、以下のように Bean のメソッド一覧が表示されます。メソッドをクリックすると当該コードにジャンプすることができます。また、ウィンドウ左の「継承されたメンバーを表示する」アイコンをクリックすると、2つ目のスクリーンショットのように継承されているメソッドを確認することも可能です。

まとめ

動画(英語)および本ブログポストでは、様々な機能を紹介しましたが、スピーカーの Marco はまとめとして以下の3つの機能の活用がポイントであると述べています。

  • ナビゲーション機能(ガターアイコンSpring ダイアグラム、Spring用ツールウィンドウを用いると、複雑なアプリケーションの理解の助けになります)
  • コード補完(properties ファイル、HTMLテンプレート/Thymeleaf 等、様々なケースでコード補完(control + space)が利用可能です。加えて、@Autowire -> コンストラクタインジェクションへの書き換え(option + Enter/ Alt + Enter)など自動コード生成も利用できます )
  • エラーハイライト(不足しているBeanや、properties の指定ミスなど赤線エラーは必ずチェックしましょう)

その他の参考資料

JetBrains のWebサイトや公式 Youtube では 以下の Spring / Spring Boot 関係の資料を提供していますので、合わせてご覧ください。

その他、ご意見、フィードバック等ございましたらTwitterや日本語サポートまでお知らせください。

image description

Discover more