我有一些简单的枚举,如下所示。
public enum Status {
ACTIVE,
PASSIVE;
private Status() {
}
}
我的REST服务输入对象中有一个String status字段。
当服务接收到这两个请求时,它将其转换为被动的。
情况1状态=1
{
"name": "David",
"surname": "White"
"status": "1"
}
情况2状态=“被动”
{
"name": "David",
"surname": ""
"status": "PASSIVE"
}
我不希望默认转换器接受数字输入(情况1)。 我的意思是,我不希望它通过使用枚举的索引,将1转换为被动。
我只想用案例2。
还要考虑我有许多这样的枚举,并且我希望将限制应用到我的所有枚举。
我怎样才能使它像我上面解释的那样工作呢?
您需要为枚举验证编写一个自定义注释。 并在字段中使用可能的值
@EnumNamePattern(regexp = "ACTIVE|PASSIVE")
private Status status;
枚举验证的自定义批注
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumNamePatternValidator.class)
public @interface EnumNamePattern {
String regexp();
String message() default "must match \"{regexp}\"";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
并为注释编写验证器
public class EnumNamePatternValidator implements ConstraintValidator<EnumNamePattern, Enum<?>> {
private Pattern pattern;
@Override
public void initialize(EnumNamePattern annotation) {
try {
pattern = Pattern.compile(annotation.regexp());
} catch (PatternSyntaxException e) {
throw new IllegalArgumentException("Given regex is invalid", e);
}
}
@Override
public boolean isValid(Enum<?> value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
Matcher m = pattern.matcher(value.name());
return m.matches();
}
}
这里,注释是以一种通用的方式编写的,您也可以将其修改为仅支持status
。