SpringでJSR 303リクエスト制約を使用して空を判定

7269 ワード

1.適用シーン
フォームに一連のパラメータをコミットし、バックグラウンドにオブジェクトにカプセル化し、オブジェクトのプロパティにさまざまなフィールド値の制約を行うことがあります.この場合、もちろんif-elseが1つ1つ判断できるので、もっと簡潔な方法があります.JSR 303+springのvalidationを使うことです.
2.使用方法手順(ステップ3)
  • エンティティークラスとフィールド制約注記
  • Controllerクラスで@Validマークアップ有効(@Validatedも@Valid対応)
  • BindingResultエラーメッセージ
  • を取得
    2.1エンティティークラスとフィールド制約注記フロントエンドフォームのフィールドデータをPersonエンティティに収集するには、次の手順に従います.
    コンストレイントが必要なフィールドに注釈を付けます.
    例:
    2.1.1 Person.java
    package com.niewj.demo.model;
    
    import lombok.Data;
    import org.hibernate.validator.constraints.Length;
    import org.hibernate.validator.constraints.URL;
    
    import javax.validation.constraints.*;
    import java.util.List;
    
    @Data
    public class Person {
        @Length(min = 4, max = 10)
        @NotNull(message = "name    ")
        private String name;
    
        @Min(0)
        @Max(40)
        @NotNull(message = "age    ")
        private Integer age;
    
        @NotBlank
        @NotBlank
        @URL(message = "logo   URL  ")
        private String logo;
    
        @NotEmpty(message = "hobbies    ")
        private List hobbies;
    
        @Email
        @NotNull(message = "email    !")
        private String mail;
    }
    @NotNull制約フィールドは空であってはならない.@NotEmpty拘束集合/mapなどは空ではなく0要素ではありません@Email制約はemail形式です@URL制約はurlのフォーマットでなければなりません
    Messageプロパティでは、デフォルトのエラーの説明を変更できます.
    2.2 Controllerクラスで@Validマークアップ有効(@Validated互換@Valid)
    2.2.1 HelloController.java
    package com.niewj.demo.controller;
    
    import com.google.gson.Gson;
    import com.niewj.demo.common.Result;
    import com.niewj.demo.model.Person;
    import com.niewj.demo.service.TestService1;
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.*;
    
    import javax.annotation.Resource;
    import javax.validation.Valid;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * test
     *
     * @author niewj
     * @since 2020/11/16 15:22
     */
    @Controller
    public class HelloController {
    
        /**
         * @param person
         * @param bindingResult
         * @return
         */
        @PostMapping("/test")
        @ResponseBody
        public Result doSth(@Valid @RequestBody Person person, BindingResult bindingResult) {
            Map map = new HashMap<>();
            if (bindingResult.hasErrors()) {
                bindingResult.getFieldErrors().stream().forEach(fe-> map.put(fe.getField(), fe.getDefaultMessage()));
                System.out.println(bindingResult.getFieldError().getDefaultMessage());
                return Result.withErrorParamData(map);
            }
    
            return Result.withSuccessData(person);
        }
    }
    @RequestBodyは、bodyの要求フロー情報(Request.getInputStream)をHttpMessageConverterによってターゲットjavaタイプに自動的に変換することができる.
  • フロントエンドContent-Typeがアプリケーション/jsonの場合、JSONメッセージ変換器を使用してJSONオブジェクトに変換します.
  • フロントエンドContent-Typeがアプリケーション/xmlの場合、XMLメッセージ変換器を使用してxmlに変換します.
  • フロントエンドContent-typeがtext/plainの場合、Stringメッセージ変換器でStringに変換します.(タイプがStringの場合のみ変換可能)
  • 2.2.2 Result.java:
    package com.niewj.demo.common;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.Map;
    
    /**
     *         
     *
     * @author niewj
     * @since 2020/12/17 18:05
     */
    @Data
    public class Result implements Serializable {
        private int code;
        private String msg;
        private T data;
    
        public Result(int code, String msg, T data) {
            this(code, msg);
            this.data = data;
        }
    
        public Result(int code, String msg) {
            this.msg = msg;
            this.code = code;
        }
    
        public static  Result withData(ResponseEnum responseCode, T data) {
            Result re = new Result(responseCode.getCode(), responseCode.getMsg());
            re.data = data;
            return re;
        }
    
        public static Result withSuccessNoData() {
            Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg());
            re.data = "";
            return re;
        }
    
        public static  Result withSuccessData(T data) {
            Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg());
            re.data = data;
            return re;
        }
    
        public static Result> withErrorParamData(Map data) {
            Result re = new Result(ResponseEnum.BAD_REQUEST.getCode(), ResponseEnum.BAD_REQUEST.getMsg());
            re.data = data;
            return re;
        }
    }

    2.2.3 ResponseEnum.java
    package com.niewj.demo.common;
    
    /**
     *      
     */
    public enum ResponseEnum {
    
        SUCCESS(200, "  "),
        BAD_REQUEST(400, "       ");
    
        /**
         *    
         */
        private Integer code;
        /**
         *     
         */
        private String msg;
    
        ResponseEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public Integer getCode() {
            return code;
        }
    }

    2.3 BindingResultエラーメッセージの取得
  • BindingResultは、制約フィールドのエラー情報を収集するために使用され、bindingResult.hasErrors()trueによってエラー情報をフィルタリングすることができる.
  • bindingResult.getFieldErrors()Listを返します.
  • FieldErrorフィールド名:getField();エラーメッセージ:getDefaultMessage()
  • 3.テストの呼び出し:
    http://localhost:8888/test

    3.1要求用例1:フィールドが空header: Content-Type: application/json
    {
        "name": "1"
    }

    応答:
    {
        "code": 400,
        "msg": "       ",
        "data": {
            "mail": "email    !",
            "hobbies": "hobbies    ",
            "name": "     4 10  ",
            "logo": "    ",
            "age": "age    "
        }
    }

    3.2要求用例2:list無要素/email/urlフォーマットが間違っているheader: Content-Type: application/json
    {
        "name": "1234",
        "hobbies": [],
        "mail": "niewj",
        "logo": "niewj.com"
    }

    応答:
    {
        "code": 400,
        "msg": "       ",
        "data": {
            "mail": "             ",
            "hobbies": "hobbies    ",
            "logo": "logo   URL  ",
            "age": "age    "
        }
    }

    3.3要求用例3:フィールド情報の完全性header: Content-Type: application/json
    {
        "name": "1234",
        "hobbies": ["running"],
        "mail": "[email protected]",
        "logo": "http://niewj.com",
        "age": 40
    }

    応答:
    {
        "code": 200,
        "msg": "  ",
        "data": {
            "name": "1234",
            "age": 40,
            "logo": "http://niewj.com",
            "hobbies": [
                "running"
            ],
            "mail": "[email protected]"
        }
    }