パラメータのチェックの仕組み
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();
}