gotokaka / RaiseTechTask7

第7週課題
0 stars 0 forks source link

第7週課題の提出PR #6

Closed gotokaka closed 1 year ago

gotokaka commented 1 year ago

概要

第7週課題の提出用PRです。

https://github.com/gotokaka/RaiseTechTask7/tree/feature/restapi_task/src/main/java/com/example/restapi

gotokaka commented 1 year ago

@ExceptionHandlerの実装

現状

  1. @GetMappingでGETリクエストのパラメータが空白やnullの場合に返すエラーが500になる
  2. POST,PATCHに関しても、リクエストボディを記載しても、空白にしても、全て成功したことになってしまう。

これらを対処していく為の作業ブランチです。

解決策の調査

質問したissue

調査手順

  1. 検索でヒットしたコードや他の受講生さんのコードを見てみる
  2. 自分にない実装やコードの内容の調査
  3. 自分のコードに落とし込んでみる

f5b81005d87404b19098791afd72d7a25eefc223

作るだけ作ったと言う状態。 仕組みを全く理解していないので、ある程度読みながら動作確認する。

参考

gotokaka commented 1 year ago

例外処理クラス実装までに実行したこと

1.コードの実行と調査(GET) 実装したクラスの動きが殆ど分からなかったので、動作確認し、わかる限り調べた。 ### 動作確認 controllerクラス ``` @Validated @RestController public class UsersController { //GETリクエストをListで返すメソッド @GetMapping("/users") public String getUser( @RequestParam("userName") @NotBlank(message = "名前を入力してください") String userName, @RequestParam("id") @NotBlank @Pattern(regexp = "^[0-9]{3}$", message = "3桁の数字を入力してください") String id, @RequestParam("birthDate") @NotNull(message = "生年月日を入力してください") @DateTimeFormat(pattern = "yyyy/MM/dd") LocalDate birthDate) { return "入力情報 " + "ユーザID:" + id + " 名前:" + userName + " 生年月日:" + birthDate; } ``` 例外処理クラス f5b81005d87404b19098791afd72d7a25eefc223 正常なリクエスト スクリーンショット 2023-06-03 13 56 05 不正なリクエスト スクリーンショット 2023-06-03 13 56 36 例外処理できてる。 ### 誕生日に関して スクリーンショット 2023-06-03 14 09 49 これはこれはExceptionHandlerによるものではなく、Springから返ってきているものだと思われる。例外処理クラスを作成する前からこの様子だった(要調査)。
2.POST/PATCHの書き換え スクリーンショット 2023-06-03 16 12 31 空文字でも200で返ってくる。 ``` @PostMapping("/users") public ResponseEntity> create( @RequestBody @NotBlank(message = "名前を入力してください") CreateForm createForm) { // 登録処理は省略 URI url = UriComponentsBuilder.fromUriString("http://localhost:8080") .path("/userName/id") // id部分は実際に登録された際に発⾏したidを設定する .build() .toUri(); return ResponseEntity.ok(Map.of("message", "name successfully created")); } ``` `@NotBlank`を書き足す。 スクリーンショット 2023-06-03 16 30 16 結果 そもそもコードがダメっぽい。 理由をchetGPTに聞いてみた。 >1. `@NotBlank`アノテーションの使用: `@NotBlank`アノテーションは、主に文字列のフィールドに対して使用されるべきです。しかし、`CreateForm`クラス自体に対して`@NotBlank`アノテーションが指定されています。これは不適切です。 >2. バリデーション結果の返却: `@NotBlank`アノテーションによるバリデーションエラーが発生した場合、現在の実装ではエラーメッセージがクライアントに返されていません。代わりに成功した場合のメッセージのみを含む`message`フィールドが返されています。バリデーションエラーが発生した場合には、エラーメッセージを適切にクライアントに返す必要があります。 `@NotBlank` はフィールドに書かないとダメ。つまり、CreateFormクラス内に書かなきゃいけない。 それに、今のままだとさっきのpostmanのキャプチャみたいにエラーが発生してもステータスコード200成功メッセージを返すようになる。 更に、クラスに記述したバリデーションを有効にするには、controllerクラスのPOST/PATCHアノテーションのそれぞれのメソッドで`@RequestBody`と一緒に`@Validated`を追加する必要がある。
変更後 83df08a47ed5d076ffa3ac77b45cbed8795f6284 #### postman スクリーンショット 2023-06-03 17 47 32 スクリーンショット 2023-06-03 17 48 31 スクリーンショット 2023-06-03 17 48 37 スクリーンショット 2023-06-03 17 48 43 ステータスコード400で返ってきている。 メッセージも表示されている。

提出します。

gotokaka commented 1 year ago

その他

@ExceptionHandlerを使ってエラーを操作する事を「エラーハンドリング」というらしい。エラーハンドリングってなんやねん!!と言うことで調べた。 エラーハンドリング

例外処理のことでした。ここで出てくるのか。 なので、今回出てきた500のレスポンスを400エラーとする事は正しい例外を表示する為の処理である。

参考

https://sebenkyo.com/2020/08/02/post-1260/