7.12 Springboot の実戦プロジェクトにおけるビジネス例外: カスタム アサーション Assert

CSDN は 1 億人の技術者を達成


序文

上記でグローバル例外処理の実践的な経験を共有しましたが业务异常、プロジェクトでは例外がスローされていません。

この記事では、実際の戦闘プロジェクトでこの例外をスローする方法について説明します。実際の戦闘シナリオは、開発中に頻繁に発生します:不正な呼び出し、ビジネス検証、データ エラー、ビジネス ロジック エラーなど。ここでは、高いスケーラビリティを次の点で考慮する必要があります。アーキテクチャと保守性の容易さ、直接スローは非常に分散しており、変更が必要な場合は多くの点を変更することになるため、スローするビジネス例外をクラスに統一してパッケージ化し、スロー条件、スローの型を統一的に制御できます。ビジネス例外や例外コードなど、カスタム アサーション Assert !がこの記事の主役です。

上記のアドレス: 7.11 SpringBoot の実際のグローバル例外処理 - 詳細な詳細


1. アサーション・アサーションとは

断言プログラミングの世界の用語です。英語ではassertです。開発者が指定された位置に事前に仮定を埋め込んでいるということでしょう。条件が真でない場合、プログラムは停止し、例外が発生します実行目的は、開発者が事前に設定した条件が満たされた場合にのみ続行できます。

言い換えれば、アサーションはコード実行ロジックに対する厳密な要件を明確に提示するため、コードの品質を向上させるための非常に効果的な手段です。開発者の経験が豊富であればあるほど、アサーションの使用はより合理的になります。したがって、このアサーションは実際にはいいですね、使ってください~


2. アサーション Assert をカスタマイズするのはなぜですか?

Javaにはアサーションの実装であるassertキーワードがあり、具体的な使い方は非常に簡単ですが、SpringにもAssertアサーションツールクラスがありますが、ここでは説明しません。

为什么不用这些Assert类呢?

2 つの主なポイントは、コストと柔軟性です。

  • このコストは、Assert クラスの実装に障壁がなく、内部実装は基本的に同じであることを意味しますif (条件) {抛出异常}。そのため、Assert ツール クラスを完全にカスタマイズできます。

  • さらに重要なのは、非常に柔軟であり、独自のビジネス例外とさまざまな技術実装例外を組み立て、統一制御、自由な拡張、シーンがどれほど複雑であっても、それを保持できます。

したがって、最初にいくつかの一般的なアサーション シナリオを定義し、シナリオが存在する場合は他のアサーション シナリオを追加しましょう。


3.空のnotNullまたはifNull

次に、共通の Assert ツール クラスを定義します。
ここに画像の説明を挿入

実現の矢面に立たされるのは、「判断は空虚だ!」ということです。最も一般的に使用されるアサーションで、基本的にはさまざまなシナリオを空と判断する必要があり、グローバル例外処理と組み合わせることで、さまざまな例外ロジックを非常にクールに処理できます。

空白の状況は数多くありますが、一般的な場合、たとえば次のような空白が少なくとも含まれている必要があります。

  • 文字列が null、空の文字列、スペースです

  • 配列/リスト/マップ/セットは null、size() は 0

したがって、私の実装コードは次のとおりです。

import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
 * 是否是null 或者 空白
**/
private static boolean isNullOrBlank(Object obj) {
    
    
    if (ObjectUtils.isEmpty(obj)) {
    
    
        return true;
    }
    if (obj instanceof String && !StringUtils.hasText((String)obj)) {
    
    
        return true;
    }
    return false;
}

あまり説明する必要はないと思います。皆さんの基礎が非常に優れていることはわかっています。その後、単純に検証してみます (もちろん、さらにオブジェクトの検証を追加することもできます)。

public static void main(String[] args) {
    
    
    // 测试isNullOrBlank是否符合期望
    // 空
    System.out.println("null:" + Assert.isNullOrBlank(null));
    System.out.println("空串:" + Assert.isNullOrBlank(""));
    System.out.println("空格:" + Assert.isNullOrBlank(" "));
    Assert anAssert = null;
    System.out.println("空对象:" + Assert.isNullOrBlank(anAssert));
    System.out.println("空数组:" + Assert.isNullOrBlank(new byte[]{
    
    }));
    System.out.println("空List:" + Assert.isNullOrBlank(new ArrayList()));
    System.out.println("空Map:" + Assert.isNullOrBlank(new HashMap()));
    System.out.println("空Set:" + Assert.isNullOrBlank(new HashSet()));
    // 非空
    System.out.println("非空String:" + Assert.isNullOrBlank("g"));
    anAssert = new Assert();
    System.out.println("非空对象:" + Assert.isNullOrBlank(anAssert));
    System.out.println("非空数组:" + Assert.isNullOrBlank(Arrays.asList("").toArray()));
    System.out.println("非空List:" + Assert.isNullOrBlank(Arrays.asList("")));
    Map<String, String> map = new HashMap<>();
    map.put("a", "b");
    System.out.println("非空Map:" + Assert.isNullOrBlank(map));
    System.out.println("非空Set:" + Assert.isNullOrBlank(map.entrySet()));
}

ここに画像の説明を挿入

本当も嘘もすべて予想通り!完璧〜

最初のアサーションメソッドが続きます。私のコードを見せてください~

/**
 * obj不能为空,如果是空则抛出异常
 **/
public static void notNull(Object obj, String msg) {
    
    
    if (isNullOrBlank(obj)) {
    
    
        throw new BizException(msg);
    }
}

もちろん、別の名前付け方法もあります。つまり、メソッド名が で始まりif、メソッドに対応しますif条件。次のように、好みに応じて自由に名前を付けることができます。

/**
 * obj如果是空则抛出异常
 **/
public static void ifNull(Object obj, String msg) {
    
    
    if (isNullOrBlank(obj)) {
    
    
        throw new BizException(msg);
    }
}

どっちがいい?記事の最後に投票してください~


4 番目に、真 isTrue か ifFalse かを判断します

空虚な判断を学ぶと、真の判断は木から地面に落ちるリンゴと同じくらい自然です。

/**
 * 表达式必须为true,如果不是true则抛出异常
 **/
public static void isTrue(boolean expression, String message) {
    
    
    if (!expression) {
    
    
        throw new BizException(message);
    }
}

同様に、別の命名方法は次のとおりです。

/**
  * 表达式如果不是true则抛出异常
  **/
public static void ifFalse(boolean expression, String message) {
    
    
    if (!expression) {
    
    
        throw new BizException(message);
    }
}

5.偽の判定 isFalseかifTrue

この時点で、もう一言言うのは不必要だと思います。コードに直接アクセスしてください~!

/**
 * 表达式必须为false,如果是true则抛出异常
 **/
public static void isFalse(boolean expression, String message) {
    
    
    if (expression) {
    
    
        throw new BizException(message);
    }
}

/**
 * 表达式如果是true则抛出异常
 **/
public static void ifTrue(boolean expression, String message) {
    
    
    if (expression) {
    
    
        throw new BizException(message);
    }
}

6. アプリケーションアサーション Assert

Assertは直接使用できますか?
確かに!
前回の実戦ではサービス層がTgResult戻り値として直接利用していましたが、そこでAssertを利用することができます。

アプリケーション 1: BookService.saveBook

たとえば、BookService の saveBook メソッドの場合、次の戻り値を直接変更できるようになりましTgResult<Integer>Integer
ここに画像の説明を挿入

具体的な改造コードが一目でわかるはず!
ここに画像の説明を挿入

ここに画像の説明を挿入

应用2: BookBorrowService.examineBookBorrow

ここではあまり説明しませんが、戻り値は直接変更できますvoidし、具体的な判定の代替コードは次のとおりです。より簡潔ではありませんか?
ここに画像の説明を挿入
ここに画像の説明を挿入


やっと

== これを見て、参考になったら666をブラッシュアップしてください、よろしくお願いします~ ==

もっと実践的な記事を読みたい場合は、やはり私の実践的なコラムをお勧めします –> フロントエンド犬兄弟と私が共同で作成したコラム「SpringBoot+SpringCloud+Vue によるフロントエンドとバックエンドのプロジェクトの分離に基づく」0からので、エンタープライズレベルの標準化されたプロジェクトですぐに実践経験を積むことができます!

具体的なメリット、計画、技術選定はすべて「 The Beginning 」で読めます

コラムを購読した後、私の WeChat を追加していただければ、各ユーザーに的を絞ったガイダンスを提供します。

さらに、私をフォローすることを忘れないでください: Tiangang gg、あなたが私を見つけられないのは残念ですが、新しい投稿を見逃すのは簡単ではありません: https://blog.csdn.net/scm_2008

おすすめ

転載: blog.csdn.net/scm_2008/article/details/132656559