使用枚举值和注释进行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 extends Payload>[] 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 extends Enum>> enumClazz(); String message() default "Value is not valid"; Class>[] groups() default {}; Class extends Payload>[] 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 extends Enum>> 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 extends Enum>> enumClass = constraintAnnotation.enumClass(); Enum[] enumValArr = enumClass.getEnumConstants(); for(Enum enumVal : enumValArr) { valueList.add(enumVal.toString().toUpperCase()); } } }
下面是Hibernate Documentation提供动态错误消息function的详细示例
您可以将@NotNull
注释与您的注释结合使用。 要使用它,您需要在ValidateString
添加@Target( { ANNOTATION_TYPE })
注释。
http://docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/validator-customconstraints.html
- Jpa namedquery with left join fetch
- 将Spring @RequestMapping注释自动记录到一个位置?
- 什么是“覆盖等价”,它与@Override有什么关系?
- 在Java 7中使用访问修饰符之后放置注释是否合法? 还是Java 8?
- Hibernate Validator:拦截无效值
- 如何在不更改注释的情况下禁用Hibernate中某些特定实体的二级缓存
- Spring Web Application已初始化两次
- jar305.jar中的注释是否应优先于FindBugs的annotation.jar中的类似注释?
- IntelliJ IDEA抱怨@NotNull参数的空检查