自定义参数验证注解

接口传参,对象接收。其中有几个参数不能同时为null,请问如何通过一个作用在字段上的自定义注解来实现?

讨论数量: 3

我也不会,直接问的,GPT生成: 你可以通过自定义注解和一个自定义的校验器来实现对字段进行校验。以下是具体的实现步骤:

  1. 创建自定义注解

    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = NotAllNullValidator.class)
    public @interface NotAllNull {
        String message() default "Fields cannot all be null";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        String[] fieldNames();
    }
  2. 创建自定义校验器

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.lang.reflect.Field;
    
    public class NotAllNullValidator implements ConstraintValidator<NotAllNull, Object> {
        private String[] fieldNames;
    
        @Override
        public void initialize(NotAllNull constraintAnnotation) {
            this.fieldNames = constraintAnnotation.fieldNames();
        }
    
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            if (value == null) {
                return true;
            }
    
            try {
                boolean allNull = true;
                for (String fieldName : fieldNames) {
                    Field field = value.getClass().getDeclaredField(fieldName);
                    field.setAccessible(true);
                    Object fieldValue = field.get(value);
                    if (fieldValue != null) {
                        allNull = false;
                        break;
                    }
                }
                return !allNull;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    }
  3. 在你的对象类上使用自定义注解

    import javax.validation.constraints.NotNull;
    
    @NotAllNull(fieldNames = {"field1", "field2", "field3"}, message = "field1, field2, and field3 cannot all be null")
    public class MyObject {
        private String field1;
        private String field2;
        private String field3;
    
        // Getters and Setters
    
        public String getField1() {
            return field1;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
    
        public String getField2() {
            return field2;
        }
    
        public void setField2(String field2) {
            this.field2 = field2;
        }
    
        public String getField3() {
            return field3;
        }
    
        public void setField3(String field3) {
            this.field3 = field3;
        }
    }
  4. 在你的控制器中使用验证

    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.validation.Valid;
    
    @RestController
    @Validated
    public class MyController {
    
        @PostMapping("/validate")
        public String validate(@Valid @RequestBody MyObject myObject) {
            return "Validated successfully";
        }
    }

这样,通过使用 @NotAllNull 注解,你可以确保在进行参数校验时,指定的字段不能同时为 null。在对象的 @NotAllNull 注解中,fieldNames 属性指定了需要检查的字段名称,如果这些字段全部为 null,校验器将返回 false 并触发验证失败。

1个月前 评论

好的,谢谢。我本来想着加到类的字段上来着。

1个月前 评论

file

file

这样简单处理就行

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!