Java项目接口通过注解类IsRange、IsRangeValidator对参数进行范围限制

原创     发表于 2020-10-16 10:15     阅读 93  

文章中提到的注解以及注解实现,均已在obatis开源框架 中实现

开发项目时,为了对参数进行安全、合法性校验,往往我们会通过大量的业务代码来进行,今天我们介绍通过注解的方式来实现对接口参数的校验。实现逻辑主要为通过注解接口和 javax.validation 中提供的@Valid完成我们想要的工作,先看看注解接口和实现类。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* 校验是否为数字,针对范围,判断是否属于1和2的范围内,value填 "1,2"即可
* @author HuangLongPu
*/
@Target({FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsRangeValidator.class})
public @interface IsRange {

String message() default "参数有误";

String value();

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

Class<? extends Payload>[] payload() default {};
}
import com.obatis.convert.CommonConvert;
import com.obatis.tools.ValidateTool;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class IsRangeValidator implements ConstraintValidator<IsRange, Object> {

String numberValue = null;

@Override
public void initialize(IsRange numberRange) {
ConstraintValidator.super.initialize(numberRange);
numberValue = numberRange.value();
}

@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {

if(ValidateTool.isEmpty(value)) {
return false;
} else if (ValidateTool.isEmpty(numberValue)) {
return false;
}
String[] numberArr = numberValue.split(",");
for (String number : numberArr) {
if(CommonConvert.toString(value).equals(number)) {
return true;
}
}
return false;
}

}

IsRange指定了只能注解在参数上,message()为默认提示,value()为我们需要限制的标准集合。如果你有更好的意见,欢迎给我发邮件(huanglongpu@126.com)。


我们来瞧瞧Controller接口上参数类的写法

@PostMapping("add")
public void add(@RequestBody @Valid CompanyInfoAddParam param)

使用 CompanyInfoAddParam 类来接受请求的参数,注意:一定要在方法中添加 @Valid 注解,否则所有的校验注解都不会生效。下面我们来看看 CompanyInfoAddParam 类中属性如何使用注解。

/**
* 添加公司信息参数接受类
* @Author: HuangLongPu
* @Date: 2020/10/15 17:13
*/
public class CompanyInfoAddParam {

@Length(min = 2, max = 60, message = "公司名称限制在2-60个长度")
private String companyName;
@Length(max = 60, message = "办公地址限制在2-150个长度")
private String officeAddress;
@Length(max = 30, message = "联系人限制在2-30个长度")
private String contactName;
@IsContactNumber
private String contactNumber;
@Length(max = 60, message = "联系邮箱限制最多60个长度")
private String contactEmail;
@IsRange(value = "0,1", message = "限制IP请求,默认0不限制 1限制")
private int limitRequestIpStatus;
@Length(max = 300, message = "请求Ip列表限制最多300个长度")
private String requestIpLimitArray;

// get、set 方法省略
}

通过上面的注解,即可在项目中实现对请求参数安全、合法性校验,而无需再使用传统方法。


更多注解,可参考obatis开源框架obatis-web中的注解校验包:https://github.com/obatis/obatis-web/tree/master/src/main/java/com/obatis/core/annotation/validator,欢迎您提出宝贵的意见,为obatis开源框架舔砖加瓦!