问题 :
需求是这样的,这有2个参数,我只想传其中一个参数,另外一个参数效验就不用效验

解决思路:
这就涉及到Validated 中的自定义注解的使用,废话不说直接上代码
1,自定义注解
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.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsNullValidator.class})
public @interface IsNull {
// 默认这个参数必须得有
boolean required() default true;
// 如果校验不通过,提示什么信息
String message() default "";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
2,自定义类IsNullValidator 复写 自定义注解IsNull的校验规则
@Slf4j
public class IsNullValidator implements ConstraintValidator<IsNull, String> {
private boolean flag = true;
private Integer size = 0;
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
log.info("isValid方法::========>>>>"+value);
size ++;
if (StringUtils.isBlank(value) && size == 1) {
flag = false;
return true;
}
if (size == 2) {
size = 0;
if (StringUtils.isBlank(value) && !flag) {
flag = true;
return false;
}
}
flag = true;
return true;
}
}
@Data
public class User {
@ApiModelProperty(value = "RampUp", required = true)
@IsNull(message = "二选一")
private String RampUp;
@ApiModelProperty(value = "cycles", required = true)
@IsNull(message = "二选一")
private String cycles;
}
这里边有一个问题没完善掉,这个方法能不能支持并发操作,有待商榷,欢迎指正
本文介绍了一种在Java中使用自定义注解实现参数校验的方法,特别适用于需要二选一参数的情况。通过创建自定义注解@IsNull及其验证器IsNullValidator,实现了对两个参数其中之一必填的需求。
444

被折叠的 条评论
为什么被折叠?



