Java String validation using enum values and annotation

后端 未结 8 1495
暖寄归人
暖寄归人 2020-11-30 23:47

I want to validate a string against a set of values using annotations.

What I want is basically this:

@ValidateString(enumClass=com.co.enum)
String d         


        
相关标签:
8条回答
  • 2020-12-01 00:22

    So here is the code being using Spring validation and works great for me. Full code is given below.


    @EnumValidator annotation definition:

    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;
    import javax.validation.ReportAsSingleViolation;
    import javax.validation.constraints.NotNull;
    
    @Documented
    @Constraint(validatedBy = EnumValidatorImpl.class)
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @NotNull(message = "Value cannot be null")
    @ReportAsSingleViolation
    public @interface EnumValidator {
    
      Class<? extends Enum<?>> enumClazz();
    
      String message() default "Value is not valid";
    
      Class<?>[] groups() default {};
    
      Class<? extends Payload>[] payload() default {};
    
    }
    


    Implementation of the above class:

    import java.util.ArrayList;
    import java.util.List;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class EnumValidatorImpl implements ConstraintValidator<EnumValidator, String> {
    
        List<String> valueList = null;
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            return valueList.contains(value.toUpperCase());
        }
    
        @Override
        public void initialize(EnumValidator constraintAnnotation) {
            valueList = new ArrayList<String>();
            Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClazz();
    
            @SuppressWarnings("rawtypes")
            Enum[] enumValArr = enumClass.getEnumConstants();
    
            for (@SuppressWarnings("rawtypes") Enum enumVal : enumValArr) {
                valueList.add(enumVal.toString().toUpperCase());
            }
        }
    
    }
    


    Usage of the above annotation is very simple

     @JsonProperty("lead_id")
     @EnumValidator(
         enumClazz = DefaultEnum.class,
         message = "This error is coming from the enum class",
         groups = {Group1.class}
     )
     private String leadId;
    
    0 讨论(0)
  • 2020-12-01 00:26

    You can use @NotNull annotation in conjunction with yours. To use that you need to add @Target( { ANNOTATION_TYPE }) annotation in ValidateString.

    http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-customconstraints.html

    0 讨论(0)
提交回复
热议问题