作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在域模型对象中,我有以下字段:
private TermStatus termStatus;
TermStatus 是一个枚举:
public enum TermStatus {
NONE,
SUCCESS,
FAIL
}
在 DTO 中,我具有与域对象中相同的字段。问题是,如何验证传递的值?如果 API 客户端现在传递一个带有枚举值的错误字符串作为参数(例如,nOnE
),它将不会收到任何有关错误的信息,只会收到状态 400 Bad Request
。是否可以像这样验证它,例如,在 @NotBlank
、@Size
之类的 javax.validation
注释的情况下,其中如果出现错误,它至少会清楚它是什么。有一个想法为此做一个单独的映射,例如 "items/1/complete-term"
而不是直接枚举传输,这样在这种情况下服务器本身会设置 SUCCESS
值到 termStatus
字段。但据我所知,这些东西在 REST API 中看起来不太好,所以我需要你的想法
最佳答案
您可以检查 String 是否对特定枚举有效,而不是直接验证枚举。要实现这样的效果,您可以创建自己的枚举验证注释。
@Documented
@Constraint(validatedBy = EnumValidatorConstraint.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@NotNull
public @interface EnumValidator {
Class<? extends Enum<?>> enum();
String message() default "must be any of enum {enum}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
然后您需要实现 validator 来检查 String 是否作为该枚举的一部分存在。
public class EnumValidatorConstraint implements ConstraintValidator<EnumValidator, String> {
Set<String> values;
@Override
public void initialize(EnumValidator constraintAnnotation) {
values = Stream.of(constraintAnnotation.enumClass().getEnumConstants())
.map(Enum::name)
.collect(Collectors.toSet());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return values.contains(value);
}
}
最后,您需要使用@EnumValidator 注释您的字段。
@EnumValidator(enum = TermStatus.class)
private String termStatus;
如果不匹配字符串,将抛出 MethodArgumentNotValidException。与@NotNull 或其他约束验证相同。
关于java - 如何验证 DTO 中的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62372281/
我是一名优秀的程序员,十分优秀!