spring怎么校验

不及物动词 其他 50

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring提供了多种方式来进行校验。

    1. 使用注解@Validated和@Valid

    Spring框架内置了javax.validation提供的校验注解,可以通过在需要校验的字段或方法参数前面加上@Validated或@Valid注解来启用校验功能。这种方式适用于直接在代码中进行校验的场景。

    例如,我们需要校验一个User对象的name字段是否为空:

    public class User {
        @NotEmpty(message = "姓名不能为空")
        private String name;
    
        // getter 和 setter 方法省略
    }
    
    public class UserController {
        @PostMapping("/user")
        public String createUser(@Validated @RequestBody User user) {
            // 处理创建用户的逻辑
        }
    }
    

    在这个例子中,我们在User对象的name字段上标注了@NotEmpty注解,当校验不通过时,会抛出MethodArgumentNotValidException异常,我们可以在异常处理器中对这个异常进行处理。

    1. 使用ValidationMessages.properties

    Spring框架支持通过配置ValidationMessages.properties文件来定义校验时的错误消息。可以自定义校验器的错误消息,或者为特定的校验约束指定错误消息。

    例如,我们可以定义校验器的错误消息,创建ValidationMessages.properties文件,并在类路径下进行配置:

    NotEmpty.user.name=姓名不能为空
    

    然后在User对象的name字段上使用@NotEmpty注解:

    public class User {
        @NotEmpty(message = "NotEmpty.user.name")
        private String name;
    
        // getter 和 setter 方法省略
    }
    

    当校验不通过时,错误消息会显示为“姓名不能为空”。

    1. 使用自定义校验器

    如果需要更复杂的校验逻辑,可以通过自定义校验器来实现。自定义校验器需要实现javax.validation.ConstraintValidator接口,并覆盖initialize和isValid方法。

    例如,我们需要校验一个日期字符串是否为合法的日期格式:

    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = DateValidator.class)
    public @interface ValidDate {
        String message() default "日期格式不正确";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    
    public class DateValidator implements ConstraintValidator<ValidDate, String> {
        @Override
        public void initialize(ValidDate constraintAnnotation) {
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            if (value == null) {
                return true;
            }
            
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.setLenient(false);
            try {
                sdf.parse(value);
                return true;
            } catch (ParseException e) {
                return false;
            }
        }
    }
    
    public class User {
        @ValidDate
        private String birthday;
    
        // getter 和 setter 方法省略
    }
    

    在这个例子中,我们定义了一个@ValidDate注解,然后编写了一个DateValidator校验器来验证日期格式。通过在User对象的birthday字段上添加@ValidDate注解,就可以进行日期格式的校验。

    总结:Spring提供了多种方式来进行校验,包括使用注解@Validated和@Valid、使用ValidationMessages.properties配置文件、以及使用自定义校验器。根据具体的需求选择适合的方式进行校验,可以增强代码的健壮性和安全性。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring 提供了多种校验方式,以下是几种常用的校验方式:

    1. 使用注解方式校验:可以使用 Spring 提供的注解来对方法参数或类属性进行校验。常用的注解包括 @NotNull、@NotBlank、@NotEmpty、@Min、@Max、@Size 等。使用注解方式校验时,需要在类或方法上添加 @Valid 注解,并在方法参数上添加相应的校验注解。

    示例代码:

    @RestController
    public class UserController {
    
        @PostMapping("/register")
        public ResponseEntity registerUser(@Valid @RequestBody User user) {
            // 处理注册逻辑
            return ResponseEntity.ok().build();
        }
    }
    
    public class User {
    
        @NotBlank(message = "用户名不能为空")
        private String username;
        
        @Size(min = 6, max = 20, message = "密码长度必须在 {min} - {max} 之间")
        private String password;
        
        // 省略其他属性和 getter/setter 方法
    }
    
    1. 使用自定义校验器:如果需要进行复杂的校验逻辑,可以使用自定义校验器。自定义校验器需要实现 Spring 的 Validator 接口,并实现其中的 validate 方法。在需要校验的方法或类上添加 @InitBinder 注解,并在该方法中注册校验器。

    示例代码:

    @RestController
    public class UserController {
    
        @InitBinder("user")
        protected void initUserBinder(WebDataBinder binder) {
            binder.addValidators(new UserValidator());
        }
    
        @PostMapping("/register")
        public ResponseEntity registerUser(@Valid @RequestBody User user) {
            // 处理注册逻辑
            return ResponseEntity.ok().build();
        }
    }
    
    public class UserValidator implements Validator {
    
        @Override
        public boolean supports(Class<?> clazz) {
            return User.class.equals(clazz);
        }
    
        @Override
        public void validate(Object target, Errors errors) {
            User user = (User) target;
            if (user.getUsername().length() < 6) {
                errors.rejectValue("username", "username.min.length", "用户名长度不能少于6位");
            }
            // 其他校验逻辑
        }
    }
    
    1. 校验局部对象:如果需要对复杂对象的某些属性进行校验,可以使用 Spring 的 @Validated 注解配合 @Valid 注解,校验局部对象。

    示例代码:

    @RestController
    public class UserController {
    
        @PostMapping("/register")
        public ResponseEntity registerUser(@RequestBody @Validated(User.Register.class) User user) {
            // 处理注册逻辑
            return ResponseEntity.ok().build();
        }
    }
    
    public class User {
    
        public interface Register {}
    
        @NotBlank(message = "用户名不能为空", groups = Register.class)
        private String username;
        
        @Size(min = 6, max = 20, message = "密码长度必须在 {min} - {max} 之间", groups = Register.class)
        private String password;
        
        // 其他属性和校验分组
    }
    
    1. 自定义校验注解:除了使用 Spring 提供的校验注解外,也可以自定义校验注解。自定义校验注解需要实现 ConstraintValidator 接口,并实现其中的 isValid 方法。在需要校验的属性上添加自定义注解即可。

    示例代码:

    @NotBlank(message = "用户名不能为空")
    @CheckUsernameExists(message = "用户名已存在")
    private String username;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = {UsernameExistsValidator.class})
    public @interface CheckUsernameExists {
    
        String message() default "Field value already exists";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    
    public class UsernameExistsValidator implements ConstraintValidator<CheckUsernameExists, String> {
    
        @Override
        public void initialize(CheckUsernameExists constraintAnnotation) {
            // 初始化
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            // 校验逻辑
        }
    }
    
    1. 全局异常处理:可以通过实现 Spring 提供的 HandlerExceptionResolver 接口来全局处理校验异常。在校验异常发生时,可以自定义返回的错误信息及 HTTP 状态码。
    @ControllerAdvice
    public class GlobalExceptionHandler implements HandlerExceptionResolver {
    
        @Override
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
            if (ex instanceof MethodArgumentNotValidException) {
                // 处理方法参数校验异常
                MethodArgumentNotValidException e = (MethodArgumentNotValidException) ex;
                BindingResult bindingResult = e.getBindingResult();
                List<String> errorMessages = new ArrayList<>();
                for (ObjectError objectError : bindingResult.getAllErrors()) {
                    errorMessages.add(objectError.getDefaultMessage());
                }
                // 返回错误信息及 HTTP 状态码
                // ...
            } else if (ex instanceof BindException) {
                // 处理对象绑定校验异常
                BindException e = (BindException) ex;
                List<String> errorMessages = new ArrayList<>();
                for (ObjectError objectError : e.getAllErrors()) {
                    errorMessages.add(objectError.getDefaultMessage());
                }
                // 返回错误信息及 HTTP 状态码
                // ...
            } else {
                // 其他异常处理逻辑
            }
            return null;
        }
    }
    

    总结:Spring 提供了多种校验方式,可以根据实际需求选择合适的方式进行校验。使用注解方式校验简单方便,适用于简单的校验逻辑;使用自定义校验器可以处理复杂的校验逻辑;使用自定义校验注解可以扩展已有的校验注解;使用全局异常处理可以统一处理校验异常,并返回合适的错误信息及 HTTP 状态码。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring提供了多种校验方式,可以对Java对象进行校验。常用的校验方式有两种:基于注解(Annotation-based)的校验和基于接口(Interface-based)的校验。

    一、基于注解的校验
    基于注解的校验使用了JSR-303规范定义的注解,通过在Java类的属性上添加注解来定义校验规则。Spring框架中有一个Validation API,可以用于执行基于注解的校验。下面介绍基于注解的校验的使用流程:

    1. 添加依赖
      需要在项目的pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
    1. 定义校验注解
      通过自定义注解来定义校验规则,可以使用Spring预定义的注解,也可以自定义注解。常用的注解有@NotNull、@NotEmpty、@Size等。

    2. 创建校验实体类
      创建一个Java类,用于接收用户输入的数据,并在属性上添加校验注解。

    3. 编写校验逻辑
      在需要进行校验的方法上添加注解@Valid,表示对方法的参数进行校验。

    二、基于接口的校验
    基于接口的校验是通过实现Spring的Validator接口来自定义校验逻辑。下面介绍基于接口的校验的使用流程:

    1. 实现Validator接口
      创建一个类,实现Validator接口,并重写两个方法:supports()和validate()。

    2. 定义校验逻辑
      在validate()方法中编写校验逻辑,可以使用Validator接口提供的方法进行校验。

    3. 注册Validator
      将自定义的Validator注册到Spring容器中,可以通过实现WebMvcConfigurer接口的addValidators()方法来注册。

    4. 在控制器中使用校验
      在需要进行校验的方法的参数上添加@Valid注解,表示需要对参数进行校验。

    以上是Spring中校验的基本使用方法,可以根据具体的业务需求和场景,选择合适的校验方式。无论是基于注解还是基于接口的校验,都可以通过校验结果对象来获取校验结果,并进行相应的处理。校验结果对象通常是BindingResult类型的参数,可以通过该对象的方法来判断校验是否通过,并获取错误信息。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部