zoukankan      html  css  js  c++  java
  • Spring 进入Controller前参数校验

    在进入Controller前完成参数的校验,针对对象参数

    分为两个验证方式

    (1)直接使用已定义的校验方式

    1、在需要进行校验的属性上增加校验类型注解

    import java.util.Date;
    import javax.validation.constraints.Past;
    import org.hibernate.validator.constraints.NotBlank;
    
    public class User {
        private String id;
    
        private String username;
    
        @NotBlank(message = "密码不能为空")
        private String password;
    
        @Past(message = "生日必须是过去的日期")
        private Date birthday;
    
        @JsonView(UserSimpleView.class)
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
    }

    2、在controller中增加注解

    3、增加 BindingResult 获取错误信息

    import java.util.ArrayList;
    import java.util.List;
    import javax.validation.Valid;
    import org.apache.commons.lang.builder.ReflectionToStringBuilder;
    import org.apache.commons.lang.builder.ToStringStyle;
    import org.springframework.data.domain.Pageable;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.annotation.DeleteMapping;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.PutMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import com.fasterxml.jackson.annotation.JsonView;
    import com.maple.dto.User;
    import com.maple.dto.UserQueryCondition;
    import com.maple.dto.User.UserDetailView;
    import com.maple.dto.User.UserSimpleView;
    import com.maple.exception.UserNotExitException;
    
    /**
     * 
     * @author hzc
     *
     */
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @PostMapping
        public User createUser(@Valid @RequestBody User user, BindingResult errors) {
            if (errors.hasErrors()) { //判断是否有错误值
                errors.getAllErrors().stream().forEach(error -> System.out.println(error.getDefaultMessage()));
            }
    
            System.out.println(user.getId());
            System.out.println(user.getPassword());
            System.out.println(user.getUsername());
            System.out.println(user.getBirthday());
            user.setId("1");
            return user;
        }
    }

     API中已有的校验方法

    (2)自定义校验方法

     1、建立自定义注解类,@Target  : 注解的范围,如方法,属性,类等 ;   @Retention  : 注解的生命周期,值为 RetentionnPolicy枚举类

    package com.maple.validator;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    @Target({ ElementType.METHOD, ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = MyConstraintValidator.class) // 绑定下面自定义的校验方法
    public @interface MyConstraint {
    
        // 需要定义以下三个属性
        String message();
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
        
    }

    2、定义校验方法,可在方法中使用 @Autowired 实现类的注入,在isValid中实现参数的验证。

    package com.maple.validator;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
        
        @Override
        public void initialize(MyConstraint constraintAnnotation) {
            System.out.println("my validator init");
        }
    
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            helloService.greeting("Tom");        
            System.out.println(value);        
            return false;
        }
    
    }

    3、调用自定义的校验,在属性上增加自定义的注解 @MyConstraint

        @MyConstraint(message = "这是一个测试")
        private String username;
  • 相关阅读:
    json字符串和xml的 比较
    Python基础第十三天——sys模块、logging模块、json模块、pickle模块
    Python基础第十二天——模块的分类、时间模块、随机数模块、摘要算法模块、os模块、时间形式轮换
    Python基础第十一天——内置函数的补充、内置函数与lambda、递归
    Python基础第九天——迭代对象、 迭代器对象、生成器、三元表达式列表解析、生成器表达式
    Python基础第八天——无参装饰器、有参装饰器
    Python基础第七天——global与nonlocal、闭包函数、装饰器
    Python基础第六天——函数的使用、函数的参数、函数的返回值、函数的嵌套、命名空间、作用域、函数对象
    Python基础第五天——字符编码、文件处理、函数的使用
    Python基础第四天——字典、布尔值、集合
  • 原文地址:https://www.cnblogs.com/maple92/p/10780243.html
Copyright © 2011-2022 走看看