スプリングブートパラメータの検証とグローバル例外処理

1. 依存関係を導入する

<!--        参数校验依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2. フィールドに検証コメントを追加する

ここに画像の説明を挿入

@Data
@ApiModel("用户视图模型")
public class UserVo {
    
    

    @ApiModelProperty("主键")
    @DecimalMax(value = "99",message = "id 不能大于99")
    private Integer id;

    @ApiModelProperty("姓名")
    @NotBlank(message = "name 不能为空")
    private String name;

    @ApiModelProperty("年龄")
    @NotNull(message = "age 不能为null")
    private Integer age;

    @NotEmpty(message = "sex 不能为空")
    private String sex;

    @Size(max = 11)
    private String phone;

}

3. テスト コントローラーを作成する

ここに画像の説明を挿入

@RestController
@RequestMapping("vilidation")
@Api(tags = "参数校验测试")
public class VilidationController {
    
    

    @ApiOperation("表单格式接口")
    @GetMapping("form")
    public R form(@Valid UserVo userVo, BindingResult bindingResult){
    
    
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        List<String> collect = fieldErrors.stream().map(o -> o.getDefaultMessage()).collect(Collectors.toList());
        return R.error().code(HttpStatus.BAD_REQUEST.value()).message("请求参数错误").data("list",collect);
    }

}

ここに画像の説明を挿入

バインディング結果インターフェイス BindingResult を各インターフェイスのパラメータとしてエラー情報を取得するのは非常に煩雑であることを考慮して、グローバル例外処理を使用できます。

4. グローバル例外処理

ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入
グローバル例外処理クラス:

@RestControllerAdvice
public class GlobalControllerAdvice {
    
    
    private static final String BAD_REQUEST_MSG = "客户端请求参数错误";
    // <1> 处理 form data方式调用接口校验失败抛出的异常
    @ExceptionHandler(BindException.class)
    public R bindExceptionHandler(BindException e) {
    
    
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        List<String> collect = fieldErrors.stream()
                .map(o -> o.getDefaultMessage())
                .collect(Collectors.toList());
        return  R.error().message("表单参数错误").code(HttpStatus.BAD_REQUEST.value()).
                data("list",collect);
    }


    // <2> 处理 json 请求体调用接口校验失败抛出的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
    
    
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        List<String> collect = fieldErrors.stream()
                .map(o -> o.getDefaultMessage())
                .collect(Collectors.toList());
        return  R.error().message("json格式参数错误").code(HttpStatus.BAD_REQUEST.value()).
                data("list",collect);
    }

    // <3> 处理单个参数校验失败抛出的异常
    @ExceptionHandler(ConstraintViolationException.class)
    public R constraintViolationExceptionHandler(ConstraintViolationException e) {
    
    
        Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
        List<String> collect = constraintViolations.stream()
                .map(o -> o.getMessage())
                .collect(Collectors.toList());
        return  R.error().message("单参数格式错误").code(HttpStatus.BAD_REQUEST.value()).
                data("list",collect);
    }


}

コントローラークラス:

@RestController
@RequestMapping("vilidation")
@Api(tags = "参数校验测试")
@Validated
public class VilidationController {
    
    

    @ApiOperation("表单格式接口")
    @GetMapping("form")
    public R form(@Validated UserVo userVo){
    
    
        return R.ok().data("uservo",userVo);
    }

    @ApiOperation("json格式接口")
    @PostMapping("json")
    public R json(@Valid @RequestBody UserVo userVo){
    
    
        return R.ok().data("uservo",userVo);
    }

    @ApiOperation("单参数接口")
    @GetMapping("single")
    public R single( @NotBlank(message = "id不能为空")  String id,
                    @NotBlank(message = "请输入用户名") String username){
    
    
        return null;
    }

}

ここに画像の説明を挿入
ここに画像の説明を挿入
リクエスト メソッドの例外や Json 形式のリクエスト本文が欠落している例外も処理できます。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

5. グループ認証

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
2 つの効果が異なる理由は、Update グループは Default グループを継承し、Save グループは継承せず、
検証アノテーションのデフォルトが Default グループであるためです。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

6. ネストされた検証

ここに画像の説明を挿入
ここに画像の説明を挿入

7. 検証アノテーションの説明と @Valid と @Validated の違い

ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/worilb/article/details/120688125