使用枚举值和注释进行Java字符串validation

我想使用注释针对一组值validation字符串。 我想要的基本上就是这个

@ValidateString(enumClass=com.co.enum) String dataType; int maxValue; int minValue; int precision; 

要么

 @ValidateString(values={"String","Boolean", "Integer"}) String dataType; int maxValue; int minValue; int precision; 

我还想根据dataType中设置的值对其他变量进行一些validation,

if(dataType =“String”)maxValue,minValue,precision all应为null或0。

我想不出通过自定义注释实现这一目标的方法。 。

有人请帮帮我

这就是我所做的。

注解

 public @interface ValidateString { String[] acceptedValues(); String message() default "{uk.dds.ideskos.validator.ValidateString.message}"; Class[] groups() default { }; Class[] payload() default { }; } 

validation类

 public class StringValidator implements ConstraintValidator{ private List valueList; @Override public void initialize(ValidateString constraintAnnotation) { valueList = new ArrayList(); for(String val : constraintAnnotation.acceptedValues()) { valueList.add(val.toUpperCase()); } } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if(!valueList.contains(value.toUpperCase())) { return false; } return true; } } 

我用它就像

 @ValidateString(acceptedValues={"Integer", "String"}, message="Invalid dataType") String dataType; Long maxValue; Long minValue; 

现在我需要弄清楚如何实现条件检查,即。 如果String然后maxValue和minValue应为null或Zero ..

有任何想法吗?

所以这里是使用Springvalidation的代码,对我来说很有用。 完整代码如下。

 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> enumClazz(); String message() default "Value is not valid"; Class[] groups() default {}; Class[] payload() default {}; } 

上述课程的实施:

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

使用上面的注释非常简单

  @JsonProperty("lead_id") @EnumValidator( enumClazz=DefaultEnum.class,message="This error is coming from the enum class", groups = {Group1.class }) private String leadId; 

抛弃String表示,并做一个真正的枚举。

 public enum DataType { STRING, BOOLEAN, INTEGER; } 

这样您就可以避免必须对先前的String dataType变量进行字符串比较,以确定它是否在枚举中。 另外,它也使得无法为成员变量dataType分配无效值,并且因为枚举可以保证在类加载器中是单例,所以它还节省了内存占用。

更改代码以使用枚举是值得的。 但是,假设您不能,您至少可以更改注释以使用枚举。

 @ValidateString(DataType.STRING) String dataType; 

这样你的ValidateString注释至少可以从枚举中受益,即使代码的其余部分没有。

现在,根本不可能完全不使用枚举,可以设置静态公共整数,映射每个接受的值。

 public class DataType { public static final int STRING = 1; public static final int BOOLEAN = 2; ... } 

但是,如果对注释参数使用String,则我们没有扩展到类型的类型检查系统,以指定仅允许特定值。 换句话说,Java缺乏这样的能力:

 public int oddInt; 

如果您尝试分配,则会抛出错误

  oddInt = 4; 

为什么这很重要? 因为如果它不适用于常规Java,那么它不能应用于常规Java类中实现的枚举。

我接受了Rajeev Singla的回复https://stackoverflow.com/a/21070806/8923905 ,只是为了优化代码并允许String参数为null,如果在您的应用程序中它不是必需的并且可以为空:

1-删除接口上的@NotNull注释

2-有关实施,请参阅下面的修改代码。

 public class EnumValidatorImpl implements ConstraintValidator  { private List valueList = null; @Override public boolean isValid(String value, ConstraintValidatorContext context) { return null == value || valueList.contains(value.toUpperCase()); } @Override public void initialize(EnumValidator constraintAnnotation) { valueList = new ArrayList<>(); Class> enumClass = constraintAnnotation.enumClass(); Enum[] enumValArr = enumClass.getEnumConstants(); for(Enum enumVal : enumValArr) { valueList.add(enumVal.toString().toUpperCase()); } } } 

您可以将@NotNull注释与您的注释结合使用。 要使用它,您需要在ValidateString添加@Target( { ANNOTATION_TYPE })注释。

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