サービスおよびコントローラーレイヤーの例外処理デザインパターン

私はザバリだと思います:

それで、rest-apiエンドポイントの現在の実装はここにあります。たとえば、ユーザーまたはフラットが見つからないなど、ある種のコーナーケースを処理したいので、適切な例外をスローしますが、どのように処理するかを示しますコントローラ?現時点では、実際には機能していません。存在しないIDを設定すると、通常どおり機能し、対応するエラーメッセージが表示されません。

サービス層:

public void delete(Long flatId) {
        flatRepository.findById(flatId).ifPresentOrElse(flat -> {
                    List<User> residents = flat.getResidents();
                    residents.forEach(resident -> resident.setFlat(null));
                    flatRepository.delete(flat);
                },
                () -> new ResourceNotFoundException("Flat " + flatId + " found"));

}

コントローラー層:

@DeleteMapping("/flats/{flatId}")
    public void deleteFlat(@PathVariable Long flatId) {
        flatService.delete(flatId);
}

GlobalExceptionHandler:

@ControllerAdvice
@RestController
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public final ErrorDetails handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ErrorDetails(LocalDateTime.now(), ex.getMessage(), 404);
    }

    @ExceptionHandler(ResourceAlreadyDefinedException.class)
    @ResponseStatus(HttpStatus.CONFLICT)
    public final ErrorDetails handleResourceAlreadyDefinedException(ResourceAlreadyDefinedException ex) {
        return new ErrorDetails(LocalDateTime.now(),  ex.getMessage(), 409);
    }

}

更新:このグローバル例外ハンドラーを作成しましたが、存在しないIDを使用してAPIに削除要求を送信すると、404が送信されず、200が返されます。この場合のような戻り値がある場合、期待どおりに動作します。

        public Flat get(Long id) {
                return flatRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Flat " + id + " not found"));
        }


     @GetMapping("/flats/{flatId}")
        public ResponseEntity<Flat> getFlat(@PathVariable Long flatId) {
            return ResponseEntity.ok(flatService.get(flatId));
     }
エフゲニー・ストレペトフ:

@ControllerAdvicewith @ExceptionHandler使用て、すべてのコントローラーおよび特定のタイプの例外に対してグローバル例外処理を実装できます

例については、こちらご覧ください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

サービス/コントローラーレイヤーでのExpress.jsのエラーの処理

分類Dev

注入およびパッケージングサービス、インフラストラクチャ、およびデータレイヤー

分類Dev

Breeze:EFContextProvider / Breezeコントローラーおよびサービスレイヤー

分類Dev

JavaEEフロントエンドメソッドでのサービスレイヤー例外の処理

分類Dev

MVCデザインパターン、サービスレイヤーの目的?

分類Dev

データマッパーパターン、例外、およびユーザー提供データの処理

分類Dev

コントローラとサービスレイヤ間のインターフェイス

分類Dev

ASP.NETMVCでIoC / DI、UoW、およびリポジトリパターンを使用せずに、ロジックをコントローラーアクションから「サービスレイヤー」に移動する

分類Dev

コントローラーのデザインパターン

分類Dev

デフォルトのコンストラクターは例外タイプを処理できません暗黙のスーパーコンストラクターによってスローされた例外

分類Dev

スーパービューのコントローラーでサブビューのジェスチャーイベントを処理する方法は?

分類Dev

制約チェックコントローラーレイヤーとサービスレイヤー

分類Dev

データベース層での例外処理のデザインパターン

分類Dev

Seleniumアラート処理テストアプローチ/デザインパターン

分類Dev

サービスレイヤーとコントローラーでのコード分離

分類Dev

サービスプロバイダーのデザインパターン

分類Dev

サービスプロバイダーのデザインパターン

分類Dev

AngularJSディレクティブ/コントローラーのライフサイクルと$ watchおよび$ onリスナーのバインド解除

分類Dev

Netsuite Suitelet:ガバナンスの制限に達することなく、トランザクションラインアイテムのリストを反復処理してレコードをロードおよび送信します

分類Dev

ユーザーのタイプごとに異なるビュー、モデル、およびコントローラー?

分類Dev

テンプレートからコントローラーへ、およびコントローラーからサービスへの角度パスパラメーター

分類Dev

処理エラー「TypeError:Expected tuple、got str」CSVをパンダマルチレベルおよびマルチインデックス(パンダ)にロード

分類Dev

コントローラーからサービスレイヤーにデータを渡すときの自動配線された依存関係

分類Dev

例外処理のグッドプラクティスデザインパターン

分類Dev

Grailsコントローラーでの動的ミックスインによる例外処理

分類Dev

ログイン後のユーザーのgetAttributeでのJspおよびサーブレットエラー

分類Dev

XcodeコンパイラカスタムコンパイラとApplellvm8.0およびAppleレビュー

分類Dev

状態デザインパターン:エラー処理

分類Dev

コントローラーまたはサービスレイヤーのSpring MVCでの検証?

Related 関連記事

  1. 1

    サービス/コントローラーレイヤーでのExpress.jsのエラーの処理

  2. 2

    注入およびパッケージングサービス、インフラストラクチャ、およびデータレイヤー

  3. 3

    Breeze:EFContextProvider / Breezeコントローラーおよびサービスレイヤー

  4. 4

    JavaEEフロントエンドメソッドでのサービスレイヤー例外の処理

  5. 5

    MVCデザインパターン、サービスレイヤーの目的?

  6. 6

    データマッパーパターン、例外、およびユーザー提供データの処理

  7. 7

    コントローラとサービスレイヤ間のインターフェイス

  8. 8

    ASP.NETMVCでIoC / DI、UoW、およびリポジトリパターンを使用せずに、ロジックをコントローラーアクションから「サービスレイヤー」に移動する

  9. 9

    コントローラーのデザインパターン

  10. 10

    デフォルトのコンストラクターは例外タイプを処理できません暗黙のスーパーコンストラクターによってスローされた例外

  11. 11

    スーパービューのコントローラーでサブビューのジェスチャーイベントを処理する方法は?

  12. 12

    制約チェックコントローラーレイヤーとサービスレイヤー

  13. 13

    データベース層での例外処理のデザインパターン

  14. 14

    Seleniumアラート処理テストアプローチ/デザインパターン

  15. 15

    サービスレイヤーとコントローラーでのコード分離

  16. 16

    サービスプロバイダーのデザインパターン

  17. 17

    サービスプロバイダーのデザインパターン

  18. 18

    AngularJSディレクティブ/コントローラーのライフサイクルと$ watchおよび$ onリスナーのバインド解除

  19. 19

    Netsuite Suitelet:ガバナンスの制限に達することなく、トランザクションラインアイテムのリストを反復処理してレコードをロードおよび送信します

  20. 20

    ユーザーのタイプごとに異なるビュー、モデル、およびコントローラー?

  21. 21

    テンプレートからコントローラーへ、およびコントローラーからサービスへの角度パスパラメーター

  22. 22

    処理エラー「TypeError:Expected tuple、got str」CSVをパンダマルチレベルおよびマルチインデックス(パンダ)にロード

  23. 23

    コントローラーからサービスレイヤーにデータを渡すときの自動配線された依存関係

  24. 24

    例外処理のグッドプラクティスデザインパターン

  25. 25

    Grailsコントローラーでの動的ミックスインによる例外処理

  26. 26

    ログイン後のユーザーのgetAttributeでのJspおよびサーブレットエラー

  27. 27

    XcodeコンパイラカスタムコンパイラとApplellvm8.0およびAppleレビュー

  28. 28

    状態デザインパターン:エラー処理

  29. 29

    コントローラーまたはサービスレイヤーのSpring MVCでの検証?

ホットタグ

アーカイブ