簡単なビジネス シナリオ シミュレーション:
現在スコア入力システムを作成している場合は、Spring Boot フレームワーク##を使用できます。 #フロントエンド ブラウザから渡された Student オブジェクトを受け取り、それをバックエンド データベースに挿入するバックエンド インターフェイスを作成します。
受信する Student オブジェクトを次のように定義します:public class Student { private String name; // 姓名 private Integer score; // 考试分数(满分100分) private String mobile; // 电话号码(11位) }次に、Web ページから渡された Student オブジェクトを受け取るための
Post request バックグラウンド インターフェイスを記述します:
@RestController public class TestController { @Autowired private StudentService studentService; @PostMapping("/add") public String addStudent( @RequestBody Student student ) { studentService.addStudent( student ); // 将student对象存入数据库 return "SUCCESS"; } }この時点で、上記の
コード の抜け穴に気づいたはずです。なぜなら、受信 Student オブジェクトに対して データ検証 を行っていないからです。 Student オブジェクトの 3 つのフィールドのうち 1 つが null の場合はどうすればよいですか?生徒のスコアが間違って 101 点と書かれていた場合はどうなりますか?学生の 11 桁の携帯電話番号を間違って入力し、もう 1 桁追加した場合はどうすればよいですか? ...待ってください
これらのデータは通常フロントエンド ページで検証されますが、
厳格で良心的なバックエンド開発エンジニアとして、受信するすべてのデータを必ず検証する必要があります。厳密に検証済み ではどう書けばいいのでしょうか?
@PostMapping("/add") public String addStudent( @RequestBody Student student ) { if( student == null ) return "传入的Student对象为null,请传值"; if( student.getName()==null || "".equals(student.getName()) ) return "传入的学生姓名为空,请传值"; if( student.getScore()==null ) return "传入的学生成绩为null,请传值"; if( (student.getScore()<0) || (student.getScore()>100) ) return "传入的学生成绩有误,分数应该在0~100之间"; if( student.getMobile()==null || "".equals(student.getMobile()) ) return "传入的学生电话号码为空,请传值"; if( student.getMobile().length()!=11 ) return "传入的学生电话号码长度有误,应为11位"; studentService.addStudent( student ); // 将student对象存入MySQL数据库 return "SUCCESS"; }書き終えましたが、手が少し痛いと、
心が少し疲れたような気がします。この Student オブジェクトは悪くありません。 , 内部には 3 つのフィールドしかありません。複雑なオブジェクトに 30 のフィールドがある場合はどうすればよいでしょうか?想像もつかないですね! 神のアノテーションの祝福実際、Spring フレームワークは、非常に初期のバージョンから、
annotationpublic class Student { @NotNull(message = "传入的姓名为null,请传值") @NotEmpty(message = "传入的姓名为空字符串,请传值") private String name; // 姓名 @NotNull(message = "传入的分数为null,请传值") @Min(value = 0,message = "传入的学生成绩有误,分数应该在0~100之间") @Max(value = 100,message = "传入的学生成绩有误,分数应该在0~100之间") private Integer score; // 分数 @NotNull(message = "传入的电话为null,请传值") @NotEmpty(message = "传入的电话为空字符串,请传值") @Length(min = 11, max = 11, message = "传入的电话号码长度有误,必须为11位") private String mobile; // 电话号码 }もちろん、同時に、次のことも必要です。オブジェクトの入り口に @Valid アノテーションを追加して、受信する Student オブジェクトの検証を開始します。
@PostMapping("/add") public String addStudent( @RequestBody @Valid Student student ) { // 棒棒哒!原先各种繁杂的参数校验工作统统都省了!一行代码不用写 studentService.addStudent( student ); // 将student对象存入MySQL数据库 return "SUCCESS"; }このとき、データを転送するときなど、特定のフィールドにエラーが入力された場合、学生のスコアが 101 点として誤って報告された場合、インターフェイスは結果を返し、エラーの詳細を求めるプロンプトが表示されます。
もちろん、この問題の原理に関しては、注釈があるため、使われるだけで役に立つものばかりで、Javaの様々なリフレクションなどの知識を活かして実装されているので、興味のある方はこの機会に勉強してみてはいかがでしょうか!
データ異常の統合インターセプト
上記の方法は、アノテーションを使用して統合データ検証を実行しますとても良い感じです
ですが、唯一の欠点は、返される結果が統合処理 を行う必要があります。たとえば、次のようにします。 特定のパラメータ検証のエラー メッセージを抽出して 返したいだけですそれをフロントエンドに送ります。 この目的のために、プロジェクトの グローバル統合例外インターセプター を構成して、すべてのデータ検証の戻り結果をフォーマットします。
@ControllerAdvice @ResponseBody public class GlobalExceptionInterceptor { @ExceptionHandler(value = Exception.class) public String exceptionHandler(HttpServletRequest request, Exception e) { String failMsg = null; if (e instanceof MethodArgumentNotValidException) { // 拿到参数校验具体异常信息提示 failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage(); } return failMsg; // 直接吐回给前端 } }上記のコードに示すように、
パラメータ検証例外 MethodArgumentNotValidException を グローバルにインターセプトし、例外に対応する詳細なメッセージ情報のみを取得してフロントエンドに吐き出します。次に、それをフロントエンドに返します。データはより明確になります:
以上がSpring Bootプロジェクトでのパラメータ検証方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。