SpringBoot例外処理(B)

パラメータのチェックの仕組み

JSR-303にHibernate

受信モードパラメータ:

  • URLパスパラメータ{ID}(@PathVariable(名= "ID")INT-何でも)
  • URLのクエリパラメータ?名前= Chanuncy(@RequestPara(名前文字列-何でも)
  • requestbody中的JSON字符串{ "名": "7yue"、 "年齢":18}(@RequestBody地図<文字列、オブジェクト>人)
  • 通常、新しい受信するDTO(データ転送オブジェクト)と伝送パラメータ、オブジェクトDTO
@Getter
@Builder
public class PersonDTO {
    private String name;
    private Integer age;
    private String  password1;
    private String  password2;

}

シンプルなパラメトリック検定:

@Validatedオープン検証

@Range @Max @Min

@RestController
@RequestMapping("/banner")
//开启验证 下文@Max验证
@Validated
public class BannerController {
    @RequestMapping("/test1/{id}")
    public String test1(@PathVariable @Max(5) int id,
                        @RequestBody @Validated PersonDTO person){
                                     //开启PersonDTO  @Length验证
        return "ok";
    }

複雑なパラメータの検証:(オブジェクト)

@Validatedオープン検証

@Validカスケード検証

PersonDTO:

@Getter
@Builder
//自定义注解后面会讲到
@PasswordEqual
public class PersonDTO {
    @Length(min = 2, max=10, message = "大小不匹配")
    private String name;
    private Integer age;

    private String  password1;
    private String  password2;
    //@Valid  开启SchoolDTO schoolName 验证
    private SchoolDTO school;
}
@Getter
@Setter
public class SchoolDTO{
    @Length(min=2)
    priavte String schoolName;
}

カスタム校正パラメータ注:

ロジックは非常に定義するために複雑になっている場合は、あなた自身のパラメータは、注意事項を確認します

パイロット:ノートと反射

四つの元のメモ:

  • @目標
  • @Rentention
  • @Documented
  • @遺伝性の

使用注釈のメカニズム:反射

反射法によって得られたクラスの例:

  • オブジェクト.getClass()
  • クラスの.class
  • Class.forNameの(完全なクラス名)

同じ文字列の検証二回新しい注釈入力

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
//将注解和逻辑处理类关联
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
    String message() default "passwords are not equal";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

ロジック:

//ConstraintValidator<注解的名字,注解修饰的对象>
public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> {
    @Override
    public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
        String password1 = personDTO.getPassword1();
        String password2 = personDTO.getPassword2();
        boolean match = password1.equals(password2);
        return match;
    }
}

チェックは、パラメータが未処理の例外がスローされますと、我々は、対応する例外処理を書きます

スプリングブート例外処理()GlobalExceptionAdviceを添加しました。

//dto参数校验异常 
@ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public UnifyResponse handleBeanValidation(HttpServletRequest req,MethodArgumentNotValidException e){
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        String errorMessage = this.formatAllErrorMessages(allErrors);
        return new UnifyResponse(10001,errorMessage,req.getMethod() + ' ' + req.getRequestURI());
    }

    //url参数异常
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public UnifyResponse handleConstraintViolationException(HttpServletRequest req, ConstraintViolationException e){
        return new UnifyResponse(10001,e.getMessage(),req.getMethod() + ' ' + req.getRequestURI());
    }


    //格式化dto参数校验异常错误信息
    private String formatAllErrorMessages(List<ObjectError> errors){
        StringBuffer errorMsg = new StringBuffer();
        errors.forEach(error -> errorMsg.append(error.getDefaultMessage()).append(';'));
        return  errorMsg.toString();
    }

おすすめ

転載: www.cnblogs.com/chauncyL/p/12536070.html