自定义校验传参注解-解决特定传参校验解决方案_奈何桥头丶你倾城一笑的博客-爱代码爱编程
自定义注解实现特定传参校验
Y. pom引用包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
E. 实现body参数校验
E-Y. 实现限定必传且限定参数传参
根据业务需求设定,限定传参校验实现
代码如下:
定义In注解
import java.lang.annotation.Documented;
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;
@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
validatedBy = {InValidator.class}
)
public @interface In {
String message() default "The value is not within a given range.";
int[] values() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
实现In注解逻辑代码
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InValidator implements ConstraintValidator<In, Integer> {
private int[] checkedValues;
public InValidator() {
}
public void initialize(In constraintAnnotation) {
this.checkedValues = constraintAnnotation.values();
}
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (value == null) {
return false;
} else {
int[] var3 = this.checkedValues;
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
Integer checkedValue = var3[var5];
if (value.equals(checkedValue)) {
return true;
}
}
return false;
}
}
}
E-E. 实现字符串传参非必填且限定参数
根据业务需求设定,限定传参校验实现
代码如下:
定义InOrNull注解
import java.lang.annotation.Documented;
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;
@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
validatedBy = {InOrNullValidator.class}
)
public @interface InOrNull {
String message() default "The value is not within a given range or null.";
String[] values() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
实现InOrNull注解逻辑代码
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InOrNullValidator implements ConstraintValidator<InOrNull, String> {
private String[] checkedValues;
public InOrNullValidator() {
}
public void initialize(InOrNull constraintAnnotation) {
this.checkedValues = constraintAnnotation.values();
}
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
} else {
String[] var3 = this.checkedValues;
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
String checkedValue = var3[var5];
if (value.equals(checkedValue)) {
return true;
}
}
return false;
}
}
}
E-S. 实现整型传参非必填且限定参数
根据业务需求设定,限定传参校验实现
代码如下:
定义InOrNull4Integer注解
import java.lang.annotation.Documented;
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;
@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
validatedBy = {InOrNull4IntegerValidator.class}
)
public @interface InOrNull4Integer {
String message() default "The value is not within a given range or null.";
int[] values() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
实现InOrNull4Integer注解逻辑代码
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InOrNull4IntegerValidator implements ConstraintValidator<InOrNull4Integer, Integer> {
private int[] checkedValues;
public InOrNull4IntegerValidator() {
}
public void initialize(InOrNull4Integer constraintAnnotation) {
this.checkedValues = constraintAnnotation.values();
}
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (value == null) {
return true;
} else {
int[] var3 = this.checkedValues;
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
Integer checkedValue = var3[var5];
if (value.equals(checkedValue)) {
return true;
}
}
return false;
}
}
}
E-S . 实现JSON字符串传参非必填且限定JSON格式
根据业务需求设定,限定传参校验实现
代码如下:
定义JsonValid注解
import java.lang.annotation.Documented;
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;
@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
validatedBy = {JsonValidValidator.class}
)
public @interface JsonValid {
String message() default "Illegal json formatted string.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
实现JsonValid注解逻辑代码
import com.mws.onepagebook.core.common.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class JsonValidValidator implements ConstraintValidator<JsonValid, String> {
public JsonValidValidator() {
}
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (value == null) {
return true;
} else if (StringUtils.equals("", value)) {
return false;
} else {
try {
ObjectMapper mapper = new ObjectMapper();
mapper.readTree(value);
return true;
} catch (IOException var4) {
return false;
}
}
}
}
S.测试
S-Y. 定义Dto参数
import com.mws.onepagebook.core.common.validator.In;
import com.mws.onepagebook.core.common.validator.InOrNull;
import com.mws.onepagebook.core.common.validator.InOrNull4Integer;
import com.mws.onepagebook.core.common.validator.JsonValid;
import lombok.Data;
import org.springframework.validation.annotation.Validated;
import java.io.Serializable;
@Validated
@Data
public class Param implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 编号 varchar
*/
@In(values = {10, 20, 30}, message = "编号传值不正确")
private Integer orderNo;
/**
* 单号 varchar
*/
@InOrNull(values = {"H10", "H20", "H30"}, message = "单号传值不正确")
private String expressNo;
/**
* 类型 Integer
*/
@InOrNull4Integer(values = {10, 20, 30}, message = "类型传值不正确")
private Integer type;
/**
* ext json
*/
@JsonValid(message = "ext参数非Json串")
private String ext;
}
@RequestMapping("/param")
public class ParamController {
@PostMapping(value = "/info",produces = MediaType.APPLICATION_JSON_VALUE)
public Param info(@Valid @RequestBody Param param){
System.out.println(param);
return param;
}
}
请求测试
localhost:8080/param/info
传参
{
“orderNo”:10, //必传 根据values定义传值
“expressNo”:“H10”, //非必传 根据values定义传值
“type”:20,//非必传 根据values定义传值
“ext”:“{}”//非必传 传值必须是json字符串
}