SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Spring Bootで作るマイクロサービス

Spring BootでWeb APIを作ろう

Spring Bootで作るマイクロサービス 第4回


  • X ポスト
  • このエントリーをはてなブックマークに追加

Web APIを実装する(2)

リクエストURL内のパスパラメータを取得する

 一昔前であれば、リクエストのパラメータをプログラム側で取得する際にはリクエストパラメータを利用するのが当たり前でしたが、ここ最近、Rest APIなどの場合にはパス内にパラメータを含めるようになりました。

 例えば、リスト4は/item/36のようなリクエストがあった場合に"36"という文字列をパラメータとして扱うためのサンプルコードです。

[リスト4]パスパラメータの指定と取得例(java/src/main/java/com/coltware/contacts/controller/ContactController.javaの抜粋)
@GetMapping("/item/{id}")   //  (1) パスパラメータの指定
public Response itemAction(@PathVariable("id") String id){ // (2) パスパラメータからの値の取得
}

 (1)では、{id}という記述を使ってパスパラメータを指定します。また、パスパラメータとして指定したパラメータは(2)のように@PathVariableを使って取得できます。

 idが必ず数字という制限をかけたい場合には、{id:^[0-9]+$}のように正規表現を使って記述することもできます。

 ただし、筆者はあまりURLレベルでこういったチェックは行わないようにしています。もし、idにアルファベットなどを指定した場合には、このパスには一致しなくなるので対象のパスが見つからないことになるからです。

 しかし、実際には、入力値エラーとして処理したい場合が多くあります。この場合には、パスに一致してほしいために個別の理由がない場合には正規表現などはあまり利用していません。

Beanのライフタイムを指定するアノテーション(@Scope)

 Beanとして登録されるクラスはデフォルトの動作として起動時に一度だけインスタンスが作成され、同じインスタンスが利用されます。

 このデフォルトの定義を変更するときには、@Scopeアノテーションを利用します。利用できるスコープには、以下の表3が利用可能です。

表3:指定できるスコープ一覧
スコープ名 概要
singleton スコープを指定しない場合と同様。起動時に一度だけインスタンスを作成し、同じインスタンスを共有する。
prototype  取得時に毎回新しいインスタンスを作成する。
request  HTTPでのリクエストごとに生成する。Webアプリケーションの場合のみ有効です。
session HTTPでのセッション単位で生成します。Webアプリケーションの場合のみ有効です。
application  サーブレットコンテキスト単位で生成します。Webアプリケーションの場合のみ有効です。
websocket  WebSocketの接続単位で生成します。Webアプリケーションの場合のみ有効です。

 サービスなどではデフォルトのsingletonでの利用が一般的ではありますが、Web APIの場合にはリクエストごとにインスタンスを生成した方が良いケースが多いためrequestを指定します。

エラー処理を行うコントローラの定義

 コントローラ内でエラーが発生したときには、それらのエラーに応じたレスポンスの定義をする場合が一般的です。従って、各個別の実装でエラーが起きても共通したエラー処理を記述したくなります。

 そのような場合、図4のようにSpring MVCではエラー処理を行うためのコントローラを@ControllerAdviceアノテーションを使って作成します。

図4:@ControllerAdviceを用いたエラー処理の共通化
図4:@ControllerAdviceを用いたエラー処理の共通化

 リスト5は、サンプルアプリケーションでの@ControllerAdviceの利用例です。

[リスト5]@ControllerAdviceの利用例(java/src/main/java/com/coltware/contacts/controller/ErrorController.javaの抜粋
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice // (1) @ControllerAdviceの指定
public class ErrorController {

    // (省略)

    @ExceptionHandler(ValidationException.class)  // (2) 処理する例外クラスの指定
    @ResponseStatus(HttpStatus.BAD_REQUEST)       // (3) レスポンスステータス
    public Response handleValidationException(HttpServletRequest req, ValidationException ex){
        return Response.createErrorResponse(ex);
    }

    //  (4) 他の例外の指定
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Response handleException(HttpServletRequest request, Exception ex){
        return Response.createErrorResponse(ex);
    }
}

 (1)では@ControllerAdviceと@ResponseBodyの指定が定義された@RestControllerAdviceを指定します。

 次に、(2)でコントローラ内で発生した例外に応じたクラスを@ExceptionHandlerで指定します。(3)でレスポンスのHTTPステータスコードを指定します。

 同様に(4)のように他の例外クラスについても指定します。

次のページ
Web APIを実装する(3)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Spring Bootで作るマイクロサービス連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11546 2020/06/01 18:54

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング