Проверка параметра проверки Springboot

задняя часть
Проверка параметра проверки Springboot

Введение

Эта статья о знании проверки параметров Springboot, конечно, она также применима к другим приложениям Java; после прочтения этой статьи вы узнаете базовую проверку параметров, проверку пользовательских параметров и проверку групповых параметров; хорошие спецификации кода и методы написания как проза Версия красивая и утонченная, струящаяся, как облака и текущая вода;

публика:искатель знаний

Искатель знаний (Наследуя дух открытого исходного кода, Распространение знаний о технологиях;)

2 Начало работы с калибровкой

2.1 pom.xml

springboot уже включает пакет валидатора в веб-стартер

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

Для проектов без Springboot вам необходимо самостоятельно вводить зависимости

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>jakarta.el</artifactId>
    <version>3.0.3</version>
</dependency>

2.2 Описание общих ограничений

  • @Null: элемент нулевой
  • @NotNull: элемент не нулевой
  • @AssertTrue: элемент истинен
  • @AssertFalse: элемент является ложным
  • @Min(value): значение числа больше или равно указанному минимальному значению.
  • @Max(value): значение числа меньше или равно указанному максимальному значению.
  • @DecimalMin(value): большое значение больше или равно указанному минимальному значению.
  • @DecimalMax(value): максимальное значение меньше или равно указанному максимальному значению
  • @Size(max=, min=): размер элемента находится в пределах указанного диапазона
  • @Digits (integer, fraction): Элемент представляет собой число, значение которого должно быть в допустимом диапазоне.
  • @Past: прошедшая дата
  • @Future: будущая дата
  • @Pattern(regex=,flag=): указанное регулярное выражение
  • @URL: должен быть URL
  • @Email: должно быть в формате электронной почты
  • @NotBlank: строка не может быть пустой
  • @NotEmpty: Коллекция не может быть пустой
  • @Length: Длина должна быть в пределах указанного диапазона
  • @Valid: проверка класса сущности

2.4 Пример ограничения сущности

  • Пример использования в качестве простой аннотации ограничений;
  • Если член является юридическим лицом, необходимо принести@Validаннотация;
/**
 * @Author lsc
 * <p> </p>
 */
@Data
public class SysUser {

    private Long id;

    @NotNull(message ="用户名不能为空")
    @Size(min = 3, max = 5, message = "用户名长度为{min}-{max}之间")
    private String username;

    @NotNull(message ="昵称不能为空")
    private String name;

    @NotNull(message ="密码不能为空")
    private String password;

    @Email(message = "邮箱格式不合法")
    private String email;

    private String gender;
}

2.5 Пример плоскости управления

  1. нужно добавить в класс@Validated;
  2. Если параметр является сущностью, его необходимо добавить@Validаннотация
/**
 * @Author lsc
 * <p> </p>
 */
@RestController
@Validated
public class SysUserController {

    // 方法参数为实体校验
    @PostMapping("/register")
    public ResponseEntity register(@Valid @RequestBody SysUser sysUser){

        return ResponseEntity.ok(sysUser);
    }

    // 方法参数校验
    @GetMapping("user")
    public ResponseEntity getUser(@NotNull(message ="用户名不能为空") String username) {
        SysUser sysUser = new SysUser();
        sysUser.setName("知识追寻者");
        return ResponseEntity.ok(sysUser);
    }
}

2.6 Перехват исключений

Глобальный захват исключения, когда проверка параметра недействительна, исключение захватывается и возвращается во внешний интерфейс;

/**
 * @Author lsc
 * <p> </p>
 */
@ControllerAdvice
public class GlobHandler {

    // 捕获方法参数校验异常
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e){
        Set<ConstraintViolation<?>> message = e.getConstraintViolations();
        HashMap<String, Object> map = new HashMap<>();
        message.stream().forEach(msg -> {
            String path = msg.getPropertyPath().toString();
            String field = path.substring(path.indexOf(".")+1);
            map.put(field,msg.getMessageTemplate());
        });
        return ResponseEntity.ok(map);
    }

    // 捕获实体参数校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseEntity resolveMethodArgumentNotValidException(MethodArgumentNotValidException e){
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        HashMap<String, Object> map = new HashMap<>();
        allErrors.stream().forEach(error -> {
            FieldError fieldError = (FieldError) error;
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        });
        return ResponseEntity.ok(map);
    }
}

2.7 Пример запроса

Три настраиваемых правила проверки

Специальные поля требуют пользовательских правил, такие как идентификационный номер, электронная почта, телефон и т. Д.;

определить аннотации проверки

@Target({ METHOD, FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = GenderValidator.class)
@Documented
public @interface Gender {

    String message() default "性别为男或者女";


    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default {};
}

GenderValidator реализует интерфейс ConstraintValidator и предоставляет правила проверки.

/**
 * @Author lsc
 * <p> </p>
 */
public class GenderValidator implements ConstraintValidator<Gender, String> {


    // 初始化校验值
    @Override
    public void initialize(Gender constraintAnnotation) {

    }

    // 校验规则
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        return "男".equals(value) || "女".equals(value);
    }
}

Используйте аннотации к переменным-членам

    @Gender()
    private String gender;

Четырехгрупповая проверка

По умолчанию, если группа не указана, она принадлежит к группе по умолчанию, использование групповой проверки способствует развитию иерархической проверки;

Создайте два новых интерфейса, один для запросов и один для добавления

/**
 * @Author lsc
 * <p> </p>
 */
public interface ADD extends Default {

}
public interface Select extends Default {
}

Изменить правила проверки объекта,Если группа не указана, по умолчанию используется группа по умолчанию;

    @NotNull(message ="用户名不能为空",groups = ADD.class)
    @Size(min = 3, max = 5, message = "用户名长度为{min}-{max}之间")
    private String username;

    @NotNull(message ="昵称不能为空", groups = Select.class)
    private String name;

    @NotNull(message ="密码不能为空",groups = ADD.class)
    private String password;

    @Email(message = "邮箱格式不合法", groups = Select.class)
    private String email;

Пример уровня управления, в настоящее время будут проверены только группа ДОБАВИТЬ и группа по умолчанию.

    // 分组校验
    @PostMapping("/user")
    public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){

        return ResponseEntity.ok(sysUser);
    }

Пять справочных документов

docs.JBoss.org/hibernate/… — это…

zhuanlan.zhihu.com/p/96403211

blog.CSDN.net/just easy_etc...

nuggets.capable/post/684490…

у-у-у. Краткое описание.com/afraid/89ah675not7from…

Подписывайтесь на искателей знаний:

tLeP2D.png