我需要验证我的 DTO bean 将枚举作为一个字段,为了达到相同的目的,我遵循了此处提供的一些解决方案,但 json 反序列化甚至在到达我的自定义验证器之前就失败了。
其他开发人员在此处提供的解决方案。
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = {EnumValueValidator.class})
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR,
ElementType.FIELD,
ElementType.METHOD,
ElementType.PARAMETER
})
public @interface EnumValue {
public abstract String message() default "{validation.enum.message}";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
public abstract Class<? extends java.lang.Enum<?>> enumClass();
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> {
private Object[] enumValues;
@Override
public void initialize(final EnumValue annotation) {
enumValues = annotation.enumClass().getEnumConstants();
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context) {
if (null != value) {
String contextValue = value.toString();
for (Object enumValue : enumValues) {
if (enumValue.toString().equals(contextValue)) {
return true;
}
}
}
return false;
}
}
并在我的 WidgetTypeAddOrUpdateDTO 上使用它作为
@EnumValue(enumClass = IsActive.class, message = "Only ACTIVE and NOT_ACTIVE accepted.")
private IsActive isActive;
我在控制器中的请求方法是这样的:
@PostMapping("/widget/type")
public ResponseEntity<String> addWidgetTypes(
@Validated @RequestBody ValidatorList<WidgetTypeAddOrUpdateDTO> widgetTypeDTOs) {
widgetTypeService.add(widgetTypeDTOs.getValidatedList());
return ResponseEntity.created(URI.create("/dashboard/admin/widget/type")).build();
}
慕少森
相关分类