精华内容
下载资源
问答
  • Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值范围、字符串的长度、日期、邮箱等等。Spring支持JSR-303 Bean Validation API,可以方便进行校验。 ...

    Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值的范围、字符串的长度、日期、邮箱等等。Spring支持JSR-303 Bean Validation API,可以方便的进行校验。

    使用注解进行校验

    先定义一个form的封装对象

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    class RequestForm {

      @Size(min = 1, max = 5)

      private String name;

      public String getName() {

        return name;

      }

      public void setName(String name) {

        this.name = name;

      }

    }

    其中name这个字段用Size注解限制长度1到5。Size是javax.validation包中的constraint注解。

     在使用时用@Valid注解表示要校验这个bean。

    ?

    1

    2

    3

    4

    5

    6

    @ResponseBody

    @GetMapping(value = "bean")

    public String validate(@Valid RequestForm request) {

      System.out.println(request.getName());

      return "OK";

    }

    自定义注解

    如果内置的注解不够用,可以自定义注解。

     比如先定义一个注解NameConstraint,限制name字段只能从特定数据中选取。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    @Target({ ElementType.FIELD, ElementType.PARAMETER })

    @Retention(RetentionPolicy.RUNTIME)

    @Constraint(validatedBy = NameConstraintValidator.class)

    @interface NameConstraint {

      String[] allowedValues();

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

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

      String message();

    }

    其中allowedValues表示合法的取值范围,message是校验失败的显示信息。

    message、groups、payload是hibernate validator要求的字段,想了解的请看官方文档

     再定义一个validator做真正的校验

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    class NameConstraintValidator implements ConstraintValidator<NameConstraint, String> {

      private String[] validValues;

      @Override

      public void initialize(NameConstraint constraintAnnotation) {

        validValues = constraintAnnotation.allowedValues();

      }

      @Override

      public boolean isValid(String value, ConstraintValidatorContext context) {

        for (String s : this.validValues) {

          if (s.equals(value)) {

            return true;

          }

        }

        return false;

      }

    }

    在form bean中按如下方式使用

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    class RequestFormWithCustomConstraint {

      @NameConstraint(allowedValues = { "bar", "foo" }, message = "只允许bar,foo")

      private String name;

      public String getName() {

        return name;

      }

      public void setName(String name) {

        this.name = name;

      }

    }

    直接校验参数

    只有一个name字段,不想封装一个对象怎么办?可以直接校验该参数

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    @Controller

    @Validated

    @RequestMapping(value = "validator")

    public class ParameterValidatorDemoController {

      @ResponseBody

      @GetMapping(value = "simple")

      public String validateParameter(@Size(min = 1, max = 5) String name) {

        System.out.println(name);

        return "OK";

      }

    }

    controller上面的@Validated注解则告诉spring需要扫描这个类,来检查其中的constraint注解。

    展开全文
  • 今天就看到了一段代码,里面判断参数是否为空长度是多少,格式对不对等就是一堆判断,然后代码中就很多判断,或者单独写了判断方法,如果请求类不复用,或者复用但是判断都一样话可以优先使用请求层校验,或者接口...

    小辉是写接口的一个小菜鸟,今天就看到了一段代码,里面判断参数是否为空长度是多少,格式对不对等就是一堆判断,然后代码中就很多判断,或者单独写了判断方法,如果请求类不复用,或者复用但是判断都一样的话可以优先使用请求层校验,或者接口层校验。

    请求层就是在Controller就判断,接口层就是在Service判断。对于不复杂的场景这些校验其实够了。

    一:常用注解

    这个包下面的注解,是不是很熟悉呀?下面小辉给你讲一下常用的哦。

    1、@Null

    这个其实很容易就看出来了,他就是值为null,为空其他都会报错,如果强制请求方传null可以使用改注解.

    2、@NotNull

    这个注解就很熟悉了吧,很多地方你可能已经用到了,很多都是见名知意,不为null,可以放在任何类型上面,只会判断该值是不是null.

    3、@NotBlank

    这个注解NotBlank应该也是常用的,看这个方法

    org.apache.commons.lang3.StringUtils.isNotBlank()

    这样类似的方法都应该使用过吧,只是不同的第三方包而已,本质就一样都是判断字符串是不是null,为不为空,该注解对应的是使用了trim()方法去除空格后根据长度来判断为不为空的。如果不想请求的字段为null和为空就可以考虑使用这个注解了。

    4、@NotEmpty

    这个注解看名字就知道就是不为空,如果用在字符串上面就只会判断长度为不为0,和为不为null,并且可以使用在下面数据类型上Collection(集合),Map,Array(数组)

    5、@Size

    被注解的元素必须在指定的范围,可以用在字符串长度的控制,集合元素个数的限制,作用于Collection(集合),Map,Array(数组)

    6、@DecimalMin

    使用注解的字段必须为数字,并且该值不能小于指定的值

    7、@DecimalMax

    使用注解的字段必须为数字,并且该值不能大于指定的值

    8、@Min

    使用注解的字段值必须为数字,并且该值要大于等于指定值,可以使用到String类型,但是值必须为数字,否则不会通过,例如设置了最小值 200,传入000201也可以通过,前面的0都会被省略调。

    9、@Max

    使用注解的字段值必须为数字,并且该值要小于等于指定值,可以使用到String类型,但是值必须为数字,否则不会通过。

    10、@AssertTrue

    注解的是boolean类型,值必须为false

    11、@AssertFalse

    注解的是boolean类型,值必须为true

    12、@Pattern

    格式化字符串,使用正则表达式匹配 ,regex值为正则表达式

    13、@Email

    使用在字符类型,校验是不是邮箱

    14、@Negative

    使用在数字类型,对应的值小于0

    15、@NegativeOrZero

    使用在数字类型,对应的值小于等于0

    16、@Positive

    使用在数字类型,对应的值大于0

    17、@PositiveOrZero

    使用在数字类型,对应的值大于等于0

    18、@Past

    使用注解的是时间类型,并且时间小于当前时间

    19、@PastOrPresent

    使用注解的是时间类型,并且时间小于等于当前时间

    20、@Future

    使用注解的是时间类型,并且时间大于当前时间

    21、@FutureOrPresent

    使用注解的是时间类型,并且时间大于等于当前时间

    22、@Digits

    使用在数字类型和字符类型,主要判断数字值的整数精度和小数精度,

    例如:@Digits(integer = 3, fraction = 2, message = "整数精度为3,小数精度为2"),如果整数超多3位,或者小数超过2位就会报错,如果是字符串整数前面的0是不算的哦。

     

    二:使用校验方式

    1、请求参数校验,在controller层校验

    使用controller层校验直接加入以上注解,如果是参数是封装的实体类,实体类里面参数用以上注解,方法使用的实体类参数前面加入

    @Validated

    例如:

      @DeleteMapping("/deleteCity")
        @ApiOperation(value = "deleteCity", notes = "删除城市")
        @ResponseBody
        public Result deleteCity(@RequestBody @NotNull Long cityId) {
            return cityService.deleteCity(cityId);
        }
    @PostMapping("/addCity")
    @ApiOperation(value = "addCity", notes = "新增城市(请求参数校验)")
    @ResponseBody
    public Result<CityEntity> addCity(@RequestBody @Validated CityEntity cityEntity) {
        return cityService.addCity(cityEntity);
    }
     

    2、接口参数校验,主要在接口层校验

    接口参数校验的话在接口类上面加注解@Validated然后在方法参数面前加注解@Valid

        Result<CityEntity> addCity(@Valid CityEntity cityEntity);

     

    这样校验是做了但是,如果你使用肯定希望错误了返回对应的message里面的信息吧,我们加入全局异常处理

    import com.swagger.knife4jdemo.RequestCodeEnum;
    import com.swagger.knife4jdemo.common.Result;
    import lombok.NoArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.ConstraintViolationException;
    import javax.validation.Path;
    import java.util.Iterator;
    import java.util.Set;
    
    /**
     * @author 哲思小辉
     * @version 1.0.0
     * @ClassName GlobalExceptionHandler.java
     * @Description 异常处理类
     * @Param
     * @createTime 2020年03月25日 11:31:00
     */
    @ControllerAdvice
    @Slf4j
    @NoArgsConstructor
    public class GlobalExceptionHandler {
    
    
        @ExceptionHandler({Exception.class})
        @ResponseBody
        public Result handler(Exception e) {
            // 接口参数验证
            if (e instanceof ConstraintViolationException) {
                log.error("接口参数异常:{}", e.getMessage());
                Set<ConstraintViolation<?>> constraintViolations = ((ConstraintViolationException) e).getConstraintViolations();
                ConstraintViolation<?> next = constraintViolations.iterator().next();
                Path propertyPath = next.getPropertyPath();
                Path.Node lastPathNode = null;
                Iterator<Path.Node> iterator = propertyPath.iterator();
                while (iterator.hasNext()) {
                    lastPathNode = iterator.next();
                }
                // 如果要返回字段就可以使用这个 name ,一般前端直接展示的话最好每一个判断里面都写message
                String name = lastPathNode == null ? "" : lastPathNode.getName();
                return new Result(RequestCodeEnum.FAILURE.code, next.getMessage());
            } else if (e instanceof MethodArgumentNotValidException) {
                log.error("请求参数异常:{}", e.getMessage());
                MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
                BindingResult bindingResult = ex.getBindingResult();
                return new Result(RequestCodeEnum.FAILURE.code, bindingResult.getFieldError().getDefaultMessage());
            } else {
                log.error("系统异常:{}", e);
    
            }
            return Result.failure();
        }
    }

    下面是我是使用后的参数异常打印出来的日志。

       

                                                    文章同时会更新到公众号,觉得对你有帮助或者有用的可以关注一下哦 

    展开全文
  • 调用 null 对象实例方法。 访问或修改 null 对象字段。 如果一个数组为null,试图用属性length获得其长度时。 如果一个数组为null,试图访问或修改其中某个元素时。 在需要抛出一个异常...

    日常开发过程中,最常见的异常莫过于NullPointerException,相信大家都对它恨之入骨吧。我也是。

    空指针异常出现的原因有以下几种:

    1. 调用 null 对象的实例方法。

    2. 访问或修改 null 对象的字段。

    3. 如果一个数组为null,试图用属性length获得其长度时。

    4. 如果一个数组为null,试图访问或修改其中某个元素时。

    5. 在需要抛出一个异常对象,而该对象为 null 时。

    《dubbo-dev-book.pdf》中提到:

    这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常。这也是一个健状的程序开发人员,在写每一行代码都应在潜意识中防止的异常。基本上要能确保一次写完的代码,在不测试的情况,都不会出现这两个异常才算合格。 

    方法参数校验又是最频繁的地方,与其在每一个接口的开头写一遍非空校验(如果参数是自定义类型,某些属性可空,某些属性非空,这下就更头疼了),不如将这些重复的工作抽取出来,封装成一个功能组件,这样一劳永逸岂不美哉?!。

    废话少说,放码过来 。

    一、思路

    1. 首先,在需要校验的方法(该类必须为spring bean,后续欢迎改进)加上自定义注解@CheckNull;
    2. 然后,在需要校验的参数前面也加上自定义注解@CheckNull,如果参数为自定义类型且需要对具体字段校验,那么就在方法参数注解里指定group属性,说明此处校验所属的分组名称;
    3. 接着,在自定义类型里面需要校验的字段添加@NotNull注解,并指定groups属性,说明此处校验对哪些分组有效;
    4. 最后,编写Aspect切面对带有@CheckNull注解的方法做拦截、校验。如果不符合,抛出空指针异常,指明某个类某个方法某个参数某个属性为空。

    二、自定义注解

    我们定义了两个注解,一个作用于方法和参数上,另一个作用于字段上。

    1、CheckNull:作用于方法和参数。

    /**
     * 设置在不同目标上面有着不同的作用<br>
     * 方法:说明该方法需要校验带该注解参数的非空<br>
     * 参数:说明该参数需要校验非空(自身非空、属性非空)<br>
     * @author z_hh  
     * @date 2019年1月2日
     */
    @Documented
    @Retention(RUNTIME)
    @Target({ METHOD, PARAMETER})
    public @interface CheckNull {
    	
    	/**
    	 * 作用于方法和参数上,表面当前校验属于哪一组
    	 * 不设置的话,无需校验参数的属性
    	 */
    	String group() default "";
    }

    2、NotNull:作用于字段。

    /**
     * 设置在不同目标上面有着不同的作用<br>
     * 字段:说明该字段需要校验非空<br>
     * @author z_hh  
     * @date 2019年1月2日
     */
    @Documented
    @Retention(RUNTIME)
    @Target({ FIELD })
    public @interface NotNull {
    	
    	/**
    	 * 作用于字段上,表面当前注解对哪一些组有效
    	 */
    	String[] groups(); 
    }

    三、Aspect切面

    敲黑板划重点

    1、定义一个本地线程变量,用于存储校验不通过的类-方法-参数-属性的信息。

    2、拦截带@CheckNull注解的方法。

    3、分别获取目标方法的参数类数组(Java8提供,相关知识在上一篇博客有所介绍,点击传送)和参数值数组。

    4、对包含@CheckNull注解的参数做校验。

    5、需要的话对自定义类型的字段校验。

    6、校验不通过时,抛出NullPointerException,并说明为空的参数(或其属性)。

    /**
     * 非空校验的切面
     * @author z_hh  
     * @date 2019年1月2日
     */
    @Component
    @Aspect
    public class CheckNullAspect {
    	
    	private static final ThreadLocal<Info> LOCAL_INFO = new ThreadLocal<Info>() {
    		protected Info initialValue() {
    			return new Info();
    		};
    	};
        
    	// 拦截带@CheckNull的方法
        @Pointcut("@annotation(cn.zhh.null_verify.annotation.CheckNull)")
        private void annotationPointCut() {
        }
    
        // 环绕切面
        @Around("annotationPointCut()")
        public Object process(ProceedingJoinPoint pjp) throws Throwable {
            
        	// 1、获取目标方法
        	Signature signature = pjp.getSignature();
    		MethodSignature methodSignature = (MethodSignature)signature;
    		Method targetMethod = methodSignature.getMethod();
    		// 1.1、设置info的类名和方法名
    		Info info = LOCAL_INFO.get();
    		info.setClassName(targetMethod.getDeclaringClass().getName());
    		info.setMethodName(targetMethod.getName());
        	
    		// 2、获取方法参数和参数值
    		Parameter[] parameters = targetMethod.getParameters();
    		Object[] args = pjp.getArgs();
    		
    		// 3、校验每个参数
    		for (int i = 0; i < parameters.length; i++) {
    			Parameter parameter = parameters[i];
    			// 3.1、获取参数注解
    			CheckNull annotation = parameter.getAnnotation(CheckNull.class);
    			// 3.1、不存在@NotNull,忽略
    			if (Objects.isNull(annotation)) {
    				continue;
    			}
    			// 3.2、校验参数
    			boolean verify = verifyParameter(annotation.group(), parameter.getName(), args[i]);
    			if (!verify) {
    				throw new NullPointerException(LOCAL_INFO.get().toString() + "为空!");
    			}
    		}
    		
    	    // finish、执行目标方法
    	    return pjp.proceed();
        }
    
    	private boolean verifyParameter(String groupName, String paramName, Object paramValue) throws Exception {
    		// 1、设置info的参数名
    		Info info = LOCAL_INFO.get();
    		info.setParamName(paramName);
    		// 2、校验参数本身是否为null
    		if (Objects.isNull(paramValue)) {
    			return false;
    		}
    		// 3、如果参数注解的group属性为"",则无需校验参数属性
    		if (Objects.equals(groupName, "")) {
    			return true;
    		}
    		// 4、校验类的字段
    		Class<?> clazz = paramValue.getClass();
    		Field[] fields = clazz.getDeclaredFields();
    		for (Field field : fields) {
    			NotNull fieldAnnotation = field.getAnnotation(NotNull.class);
    			// 3.1、没有注解或者注解不包含指定分组
    			if (Objects.isNull(fieldAnnotation) || !Arrays.asList(fieldAnnotation.groups()).contains(groupName)) {
    				// 不需要校验
    				continue;
    			}
    			field.setAccessible(true);
    			// 3.2、获取属性值
    			Object value = field.get(paramValue);
    			if (Objects.isNull(value)) {
    				//获取属性名
    				String name = field.getName();
    				info.setFieldName(name);
    				return false;
    			}
    		}
    		// 5、校验通过
    		return true;
    	}
    }

    你们需要的Info类。

    /**
     * 参数相关信息
     * @author z_hh
     * @time 2019年1月2日
     */
    public class Info {
    	
    	/** 类名 */
    	private String className;
    	
    	/** 方法名 */
    	private String methodName;
    	
    	/** 参数名 */
    	private String paramName;
    	
    	/** 属性名 */
    	private String fieldName;
    
    	public String getClassName() {
    		return className;
    	}
    
    	public void setClassName(String className) {
    		this.className = className;
    	}
    
    	public String getMethodName() {
    		return methodName;
    	}
    
    	public void setMethodName(String methodName) {
    		this.methodName = methodName;
    	}
    
    	public String getParamName() {
    		return paramName;
    	}
    
    	public void setParamName(String paramName) {
    		this.paramName = paramName;
    	}
    
    	public String getFieldName() {
    		return fieldName;
    	}
    
    	public void setFieldName(String fieldName) {
    		this.fieldName = fieldName;
    	}
    	
    	@Override
    	public String toString() {
    		StringBuilder builder = new StringBuilder();
    		if (Objects.nonNull(className)) {
    			builder.append("类").append(className);
    		}
    		if (Objects.nonNull(methodName)) {
    			builder.append("的方法").append(methodName);
    		}
    		if (Objects.nonNull(paramName)) {
    			builder.append("的参数").append(paramName);
    		}
    		if (Objects.nonNull(fieldName)) {
    			builder.append("的属性").append(fieldName);
    		}
    		
    		return builder.toString();
    	}
    
    }

    四、测试

    写完一个功能后最开心的时刻。

    1、使用该功能的目标方法。

    /**
     * 测试非空校验的服务
     * @author z_hh
     * @time 2019年1月2日
     */
    @Service
    public class CheckNullService {
    
    	@CheckNull
    	public void test(String nullVal, @CheckNull(group="test") Param param) {
    		System.out.println(param);
    	}
    }

    2、自定义参数类。

    我们设置了property3非空。

    /**
     * 自定义参数类
     * @author z_hh
     * @time 2019年1月2日
     */
    public class Param {
    
    	private int property1;
    	
    	private String property2;
    	
    	@NotNull(groups = { "test" })
    	private Date property3;
    
    	@Override
    	public String toString() {
    		return "Param [property1=" + property1 + ", property2=" + property2 + ", property3=" + property3 + "]";
    	}
    	
    	/* 省略getter和setter */
    	
    }

    3、Junit测试代码。 

    /**
     * Junit测试类
     * @author z_hh
     * @time 2019年1月2日
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class CheckNullServiceTest {
    
    	@Autowired
    	private CheckNullService service;
    	
    	@Test
    	public void test() {
    		
    		Param param = new Param();
    		service.test(null, param);
    		
    	}
    }

    4、运行结果。

    哎呀,报错了???不对,这不就是我们期望的结果吗?!

    ※如果看到property3变成了arg1,说明你的开发环境没有配置开启-parameters(怎么弄?我教你,点击传送)。

    五、优化&扩展

    1、可以在@CheckNull里面定义一个message属性,作用于方法参数上时指定相应的值,然后在切面里面校验到参数(或其部分属性)为空时,获取注解的该属性值,取代默认的"类-方法-参数-属性为空!"的信息。

    2、可以将切面里面校验到参数(或其部分属性)为空时抛出空指针异常改为返回指定的值(一般是我们封装的通用方法返回值对象)。

    展开全文
  • 前言 ...上一篇文章讲了多种接受参数的方法【快学springboot】3.多种接受参数的方式。因为目前json类型的参数是最常用的,所以这里只讲解json类型的参数校验。其他类型的大同小异。 新建一个Param....

    前言

    在开发接口的时候,参数校验是必不可少的。参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定。如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常。

    上一篇文章讲了多种接受参数的方法【快学springboot】3.多种接受参数的方式。因为目前json类型的参数是最常用的,所以这里只讲解json类型的参数校验。其他类型的大同小异。

    新建一个Param.java

    public class Param {
     
     private String username;
     public String getUsername() {
     return username;
     }
     public void setUsername(String username) {
     this.username = username;
     }
    }

    目前这个类只有一个username属性。

    使用Validated注解开启参数校验

    @PostMapping(value = "/validate/notblank")
    public Object validateNotBlank(@RequestBody @Validated Param param) {
     return param;
    }

    NotBlank 非空判断

    修改Param.java,在username属性上添加NotBlank注解

    @NotBlank
    private String username;

    测试

    通过控制台,我们可以看到抛出了一个MethodArgumentNotValidException异常,上面的返回结果其实是springboot默认的异常捕获器返回的。为了统一接口的数据返回格式,我们也需要自定义一个全局异常拦截器。

    我们还可以通过NotBlank注解的message属性设置异常信息:

    @NotBlank(message = "username不可为空")
    private String username;

    Length字符串长度判断

    还是那个Param.java,我们给username加上Length注解,如下:

    @NotBlank(message = "username不可为空")
    private String username;

    Length字符串长度判断

    还是那个Param.java,我们给username加上Length注解,如下:

    @Length(min = 2,max = 3)
    @NotBlank(message = "username不可为空")
    private String username;

     

    同样,我们也可以使用message属性来设置返回错误信息。这里就不演示了。

    NotNull 限制属性不可谓null

    虽然前面有NotBlank注解了,但是一些Integer,Long等包装类型,还是需要用到NotNull注解来判断。

    范围判断Min和Max

    在Param.java上新增一个age属性,并且使用Min和Max注解限定大小

    @Min(1)
    @Max(100)
    private Integer age;

    这样写的问题是,如果age为空,则不会校验。如下:

    所以我们还需要加上NotNull注解

    @Min(1)
    @Max(100)
    @NotNull
    private Integer age;

    也可使用@Range注解来限定范围

    @Range(min = 1, max = 100)

    Email 注解校验邮件

    @Email
    private String email;

    Pattern 注解校验正则表达式

    @Pattern(regexp = "\d{4}-\d{2}-\d{2}")
    private String birthday;

    总结

    以上总结了部分常用的参数校验的方法,当然还有很详细的一些没有列举处理,有需要的,可以自行搜索使用方式即可。参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的,这样才能方便客户端解释。

     

    转载于:https://www.cnblogs.com/luchangjiang/p/10805893.html

    展开全文
  • 好久之前更新了单个注解参数校验以后。偷懒了好久,今天就把多个注解自定义的参数校验写了一下,思路是一样的,只是一个注解包含的字段把它分解成了多个注解,类似于java...@CheckLength// 校验长度的,集合大小的 ...
  • 验证参数注解校验总结

    千次阅读 2019-09-04 09:30:51
    参数校验注解使用规则方法】: 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会...
  • 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证...
  • 在日常项目开发中,我们为了数据正确性,后端都会单独对数据进行校验,比如说用户信息中年龄校验,用户名长度校验,用户性别校验等。 校验方式分类 我们常见的校验方式分为俩种,一种是使用校验类来进行校验,...
  • CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,...
  • ]//一些js校验的方法。 //函数返回true,则数值正确,返回false则数值格式错误 //基本参数说明:value:值,name:控件名称,需要提示的名称,len:控件长度,isNull:是否为空,true可以为空 //基本校验-非空校验 ...
  • jsp页面上一些js校验方法

    千次阅读 2015-10-28 13:44:13
    //一些js校验的方法。 //函数返回true,则数值正确,返回false则数值格式错误 //基本参数说明:value:值,name:控件名称,需要提示的名称,len:控件长度,isNull:是否为空,true可以为空 //基本校验-非空校验 ...
  • 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证...
  • 以前验证数据的合法性,需要通过写大量的if…else…条件判断,有没有更简便快捷的方法呢,答案是有的,就是使用validator进行数据校验。 spring boot的validation模块已经为我们提供了许多默认直接可以使用的注解,...
  • 上一篇文章讲了多种接受参数的方法【快学springboot】3.多种接受参数的方式。因为目前json类型的参数是最常用的,所以这里只讲解json类型的参数校验。其他类型的大同小异。 新建一个Param.jav...
  • 不是所有的接口方法都需要进行参数校验的,所以可以使用自定义注解,只处理有注解标注的方法 1. 环境 SpringBoot 2.2.5.RELEASE JDK 1.8.0_271 2. 编码 2.1 接口 2.2 自定义注解 2.3 参数校验异常处理器 ...
  • validator参数校验 本文只是针对springboot框架中validator...在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等。 会导致如下情况: - 验证代码繁琐 - 方法内代码显得冗长 -...
  • 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证...
  • 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等。 会导致如下情况: - 验证代码繁琐 - 方法内代码显得冗长 - 修改相同逻辑验证代码时需要修改涉及到同样逻辑所有地方 ...
  • 文章目录请求字段自定义校验一、自定义校验类二、...为实现对输入字节长度的校验,定义ByteLength校验接口,在ByteLengthValidatorImpl中通过isValid()方法实现对字节长度的校验。 自定义校验类的实现代码如下,下...
  • springmvc校验

    2018-07-22 21:12:00
    页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。 具体需求: 商品修改,添加校验校验商品名称长度,生产日期非空校验),如果校验出错,在商品...
  •  1、做一个field注解,注解有两个参数:是否必填、toString之后最大长度  2、对某个request类(或基类),使用注解标记某个字段的校验详情  3、通用static方法,利用反射获取属性值,并做校验。不通过则抛出...
  • 页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。 2、具体需求: 商品修改,添加校验校验商品名称长度,生产日期非空校验),如果校验出错,在页面...
  • 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,如果在业务逻辑到处都有这种代码会显得: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整...
  • SpringBoot校验框架:yue-library

    千次阅读 2021-04-19 09:41:22
    提供基本非空、长度、大小等校验方法,也提供一些特殊正则校验、身份证、电话、邮箱、IP等校验方法。 二、注解介绍 @Valid 被注解元素是一个POJO对象,用于检查此对象所有被注解字段值是否符合预期 Bean ...
  • 模块间接口报文校验1

    2014-12-13 16:17:24
    参数校验 模板直接同步报文需要对报文个...2、解析参数校验文档的类、读取报文信息与参数校验文档进行比较的方法  web.xml配置信息    checkConfigFilePath  conf/para_check_config.xml   para_check_config.xml

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 226
精华内容 90
关键字:

校验参数长度的方法