SpringBootのフロントエンドからのパラメーター検証例外を処理する方法

1.前提条件

  • 依存関係をインポートする
	 <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

2.直接確認し、システムから表示されたエラーメッセージを返します

  • フロントエンドから渡されたカプセル化されたオブジェクト、オブジェクトの属性bean(例としてBrandEntity)では検証アノテーション(追加されている@NotNull@NotEmptyなど)。
  • @Validcontroller内部にマークされたリクエスト本文は、エンティティクラスの属性を検証する必要があることを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];
    }
}

  • から継承しますErrors
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)->{
    
    
                // FieldError 获取错误提示
                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
//@ControllerAdvice(basePackages = "")
@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){
    
    
  • 正規のシステムエラーコード
/**
	错误码和错误信息定义类
	1 错误码定义规则为5个数字
	2 前两位代表错误场景,后三位代码错误码,例如10001.10代表通用,001系统异常
	3 维护错误码后需要维护错误描述,将他们定义为枚举形式
*/
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 ){
    
    /

おすすめ

転載: blog.csdn.net/JISOOLUO/article/details/105584217