中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot參數怎么校驗

發布時間:2022-05-13 15:54:29 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

本篇內容主要講解“SpringBoot參數怎么校驗”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot參數怎么校驗”吧!

    使用傳統方式的弊端

    public String addUser(User user) {
         if (user == null || user.getId() == null || user.getAccount() == null || user.getPassword() == null || user.getEmail() == null) {
             return "對象或者對象字段不能為空";
         }
         if (StringUtils.isEmpty(user.getAccount()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getEmail())) {
             return "不能輸入空字符串";
         }
         if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {
             return "賬號長度必須是6-11個字符";
         }
         if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {
             return "密碼長度必須是6-16個字符";
         }
         if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {
             return "郵箱格式不正確";
         }
         // 參數校驗完畢后這里就寫上業務邏輯
         return "success";
     }

    這樣做確實沒有什么問題,而且排版也工整,但代碼太繁瑣了,如果有幾十個字段要校驗,那這個方法里面將會變得非常臃腫,實在不夠優雅。下面我們就來講講如何使用最優雅的方式來解決。

    引入依賴

    <dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

    注解說明

    注解說明
    @AssertFalse被注解的元素必須為 false
    @AssertTrue被注解的元素必須為 true
    @DecimalMax(value)被注解的元素必須是一個數字,其值必須小于等于指定的最大值
    @DecimalMin(value)被注解的元素必須是一個數字,其值必須大于等于指定的最小值
    @Digits (integer, fraction)被注解的元素必須是一個數字,其值必須在可接受的范圍內
    @Null被注解的元素必須為空
    @NotNull被注解的元素必須不為空
    @Min(value)被注解的元素必須是一個數字,其值必須大于等于指定的最大值
    @Max(value)被注解的元素必須是一個數字,其值必須小于等于指定的最大值
    @Size(max, min)被注解的元素的長度必須在指定的范圍內
    @Past被注解的元素必須是一個過去的日期
    @Future被注解的元素必須是一個未來的日期
    @Pattern(value)被注解的元素必須符合指定的正則表達式

    下面我們以此來在業務中實現

    一、對實體類進行校驗

    1、entity

    @Data
    public class User {
        @NotNull(message = "用戶id不能為空")
        private Long id;
        @NotNull(message = "用戶賬號不能為空")
        @Size(min = 6, max = 11, message = "賬號長度必須是6-11個字符")
        private String account;
        @NotNull(message = "用戶密碼不能為空")
        @Size(min = 6, max = 11, message = "密碼長度必須是6-16個字符")
        private String password;
        @NotNull(message = "用戶郵箱不能為空")
        @Email(message = "郵箱格式不正確")
        private String email;
    }

    2、controller

    @RestController
    public class UserController {
        @PostMapping("/addUser")
        public void addUser(@RequestBody @Valid User user) {
    		//業務
        }
    }

    3、編寫全局統一異常處理

    import org.springframework.validation.ObjectError;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import javax.validation.ConstraintViolation;
    import javax.validation.ConstraintViolationException;
    import java.util.stream.Collectors;
    /**
     * 全局異常處理
     *
     * @author master
     */
    @RestControllerAdvice
    public class ExceptionConfig {
        /**
         * 參數為實體類
         * @param e
         * @return
         */
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        public String handleValidException(MethodArgumentNotValidException e) {
            // 從異常對象中拿到ObjectError對象
            ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
            // 然后提取錯誤提示信息進行返回
            return objectError.getDefaultMessage();
        }
        /**
         * 參數為單個參數或多個參數
         * @param e
         * @return
         */
        @ExceptionHandler(value = ConstraintViolationException.class)
        public String handleConstraintViolationException(ConstraintViolationException e) {
            // 從異常對象中拿到ObjectError對象
            return e.getConstraintViolations()
                    .stream()
                    .map(ConstraintViolation::getMessage)
                	.collect(Collectors.toList()).get(0);
        }
    }

    然后我們使用apipost測試

    SpringBoot參數怎么校驗

    二、針對單個參數進行校驗

    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.validation.constraints.NotNull;
    @RestController
    @Validated
    public class TestController {
        @GetMapping("/test")
        public void test(@NotNull(message = "id不能為空") Integer id) {
        }
    }

    然后我們使用apipost測試

    SpringBoot參數怎么校驗

    三、分組校驗

    場景:在新增時我們需要id為空,但修改時我們又需要id不為空,總不可能搞兩個類吧,這時候分組校驗的用處就來了

    1、entity

    import lombok.Data;
    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    @Data
    public class User {
        public interface Insert{
        }
        public interface Update{
        }
        @NotNull(message = "用戶id不能為空",groups = Update.class)
        @Null(message = "用戶id必須為空",groups = Integer.class)
        private Long id;
        private String account;
        private String password;
        private String email;
    }

    2、controller

    @PostMapping("/add")
    public void add(@RequestBody @Validated(User.Insert.class) User user) {
    }

    添加時就用User.Insert.class,修改時就用User.Update.class

    四、自定義分組校驗

    場景:當type為1時,需要參數a不為空,當type為2時,需要參數b不為空。

    1、entity

    import com.example.demo.provider.CustomSequenceProvider;
    import lombok.Data;
    import org.hibernate.validator.group.GroupSequenceProvider;
    import javax.validation.constraints.NotEmpty;
    import javax.validation.constraints.Pattern;
    @Data
    @GroupSequenceProvider(value = CustomSequenceProvider.class)
    public class CustomGroup {
        /**
         * 類型
         */
        @Pattern(regexp = "[A|B]" , message = "類型不必須為 A|B")
        private String type;
        /**
         * 參數A
         */
        @NotEmpty(message = "參數A不能為空" , groups = {WhenTypeIsA.class})
        private String paramA;
        /**
         * 參數B
         */
        @NotEmpty(message = "參數B不能為空", groups = {WhenTypeIsB.class})
        private String paramB;
        /**
         * 分組A
         */
        public interface WhenTypeIsA {
        }
        /**
         * 分組B
         */
        public interface WhenTypeIsB {
        }
    }

    2、CustomSequenceProvider

    import com.example.demo.controller.CustomGroup;
    import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
    import java.util.ArrayList;
    import java.util.List;
    public class CustomSequenceProvider implements DefaultGroupSequenceProvider<CustomGroup> {
        @Override
        public List<Class<?>> getValidationGroups(CustomGroup form) {
            List<Class<?>> defaultGroupSequence = new ArrayList<>();
            defaultGroupSequence.add(CustomGroup.class);
            if (form != null && "A".equals(form.getType())) {
                defaultGroupSequence.add(CustomGroup.WhenTypeIsA.class);
            }
            if (form != null && "B".equals(form.getType())) {
                defaultGroupSequence.add(CustomGroup.WhenTypeIsB.class);
            }
            return defaultGroupSequence;
        }
    }

    3、controller

    @PostMapping("/add")
    public void add(@RequestBody @Validated CustomGroup user) {
    }

    五、自定義校驗

    雖然官方提供的校驗注解已經滿足很多情況了,但還是無法滿足我們業務的所有需求,比如校驗手機號碼,下面我就以校驗手機號碼來做一個示例。

    1、定義校驗注解

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = PhoneValidator.class)
    public @interface Phone {
        String message() default "手機號碼格式有誤";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }

    注:groups和payload是必須要寫的,Constraint是使用哪個類來進行校驗。

    2、實現注解

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.util.regex.Pattern;
    /**
     * @author master
     */
    public class PhoneValidator implements ConstraintValidator<Phone, Object> {
        @Override
        public boolean isValid(Object telephone, ConstraintValidatorContext constraintValidatorContext) {
            String pattern = "^1[3|4|5|6|7|8|9]\\d{9}$";
            return Pattern.matches(pattern, telephone.toString());
        }
    }

    最后直接用到參數前面或者實體類變量上面即可。

    六、嵌套校驗

    當某個對象中還包含了對象需要進行校驗,這個時候我們需要用嵌套校驗。

    @Data
    public class TestAA {
        @NotEmpty(message = "id不能為空")
        private String id;
        @NotNull
        @Valid
        private Job job;
        @Data
        public class Job {
            @NotEmpty(message = "content不能為空")
            private String content;
        }
    }

    七、快速失敗

    Spring Validation默認會校驗完所有字段,然后才拋出異常。可以通過配置,開啟Fali Fast模式,一旦校驗失敗就立即返回。

    import org.hibernate.validator.HibernateValidator;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    @Configuration
    public class FailFastConfig {
        @Bean
        public Validator validator() {
            ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                    .configure()
                    // 快速失敗模式
                    .failFast(true)
                    .buildValidatorFactory();
            return validatorFactory.getValidator();
        }
    }

    注意事項

    SpringBoot 2.3.x 移除了validation依賴需要手動引入依賴。

    到此,相信大家對“SpringBoot參數怎么校驗”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    昌邑市| 七台河市| 凭祥市| 雷波县| 漳平市| 环江| 奉贤区| 岳池县| 东乌珠穆沁旗| 普格县| 新巴尔虎左旗| 依安县| 新蔡县| 江孜县| 托里县| 晋城| 家居| 临江市| 浙江省| 伊川县| 诸暨市| 湾仔区| 和田县| 张家界市| 泰来县| 阿拉善左旗| 哈尔滨市| 满洲里市| 连山| 赣榆县| 格尔木市| 丰都县| 东丰县| 宜良县| 依兰县| 县级市| 连城县| 长沙县| 庆城县| 星座| 航空|