1.前提条件
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2.直接確認し、システムから表示されたエラーメッセージを返します
- フロントエンドから渡されたカプセル化されたオブジェクト、オブジェクトの属性
bean
(例としてBrandEntity)では検証アノテーション(追加されている@NotNull
、@NotEmpty
など)。
@Valid
controller
内部にマークされたリクエスト本文は、エンティティクラスの属性を検証する必要があることをSpringに通知します。検証が失敗すると、エラーメッセージがフロントエンドに返されます。
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand ){
3、利用BindingResult
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand , BindingResult result){
BindingResult
内部にカプセル化された対応するエンティティクラスの検証結果
BindingResult
public interface BindingResult extends Errors {
String MODEL_KEY_PREFIX = BindingResult.class.getName() + ".";
@Nullable
Object getTarget();
Map<String, Object> getModel();
@Nullable
Object getRawFieldValue(String var1);
@Nullable
PropertyEditor findEditor(@Nullable String var1, @Nullable Class<?> var2);
@Nullable
PropertyEditorRegistry getPropertyEditorRegistry();
String[] resolveMessageCodes(String var1);
String[] resolveMessageCodes(String var1, String var2);
void addError(ObjectError var1);
default void recordFieldValue(String field, Class<?> type, @Nullable Object value) {
}
default void recordSuppressedField(String field) {
}
default String[] getSuppressedFields() {
return new String[0];
}
}
public interface Errors {
String NESTED_PATH_SEPARATOR = ".";
String getObjectName();
void setNestedPath(String var1);
String getNestedPath();
void pushNestedPath(String var1);
void popNestedPath() throws IllegalStateException;
void reject(String var1);
void reject(String var1, String var2);
void reject(String var1, @Nullable Object[] var2, @Nullable String var3);
void rejectValue(@Nullable String var1, String var2);
void rejectValue(@Nullable String var1, String var2, String var3);
void rejectValue(@Nullable String var1, String var2, @Nullable Object[] var3, @Nullable String var4);
void addAllErrors(Errors var1);
boolean hasErrors();
int getErrorCount();
List<ObjectError> getAllErrors();
boolean hasGlobalErrors();
int getGlobalErrorCount();
List<ObjectError> getGlobalErrors();
@Nullable
ObjectError getGlobalError();
boolean hasFieldErrors();
int getFieldErrorCount();
List<FieldError> getFieldErrors();
@Nullable
FieldError getFieldError();
boolean hasFieldErrors(String var1);
int getFieldErrorCount(String var1);
List<FieldError> getFieldErrors(String var1);
@Nullable
FieldError getFieldError(String var1);
@Nullable
Object getFieldValue(String var1);
@Nullable
Class<?> getFieldType(String var1);
}
- 返したいデータに再度パッケージ化します
R
これは、フロントエンドデータをカプセル化するために使用された私の記事の別の例です。Rの例
if (result.hasErrors()){
Map<String,String> map = new HashMap<>();
result.getFieldErrors().forEach((item)->{
String message = item.getDefaultMessage();
String field = item.getField();
map.put(field,message);
});
return R.error(400,"提交数据不合法").put("data",map);
}
4.一元化された処理
- 提供されているSpringMVCを使用した統一された例外処理
ControllerAdvice
- 例外を処理するクラスを抽出します
ExcExceptionControllerAdvice
@RestControllerAdvice 的basePackages
処理する必要のあるコントローラーを指定します
@ExceptionHandler(value = MethodArgumentNotValidException.class)
値:処理する必要のある例外の種類
@Slf4j
@RestControllerAdvice(basePackages = "")
public class ExcExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型,{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String,String> map = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError)->{
map.put(fieldError.getField(),fieldError.getDefaultMessage());
});
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",map);
}
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
log.error("错误:" + throwable);
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
- この集中処理を使用する場合、コントローラーは例外をスローする必要があるため、要求パラメーターから例外を削除すると、
BindingResult
例外は処理クラスで検出されます。
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand){
public enum BizCodeEnume {
UNKNOW_EXCEPTION(10000,"系统未知异常"),
VAILD_EXCEPTION(10001,"参数格式检验失败");
private int code;
private String msg;
BizCodeEnume(int code, String msg) {
this.code = code;
this.msg = msg;
}
public String getMsg() {
return msg;
}
public int getCode() {
return code;
}
}
5.拡張(JSR303パケットチェック)
public @interface NotBlank {
String message() default "{javax.validation.constraints.NotBlank.message}";
Class<?>[] groups() default {
};
- したがって、何もせずにインターフェイスをロゴとして定義します
- 例えば
public interface AddGroup {
}
@NotBlank(groups = AddGroup.class)
private String brandName;
- そして、対応するメソッドでそれを書くと、名前は
save
メソッドの時にのみ検証されます
@Validated
上記の役に立たないグループ化とは異なり@Valid
ますが、ここでは注意が必要です
@RequestMapping("/save")
public R save(@Validated({
AddGroup.class }) @RequestBody BrandEntity brand ){
/