我需要验证我的 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(); }
1 回答
慕少森
TA贡献2019条经验 获得超9个赞
要应用验证,您需要使用 @Valid annotaion。您必须缺少 @Valid 这就是您的验证不起作用的原因。
稍后还有一个问题。在您的 DTO WidgetTypeAddOrUpdateDTO 中,枚举值持有者变量是 IsActive 类型,它是一个枚举。当 spring 将从 JSON 填充/反序列化 DTO 时,如果枚举值无效,它将抛出异常,因此您需要将其更改为 String 类型。一旦将其更改为 String,则 string 可以包含任何文本,但您的验证将受到限制,如果存在无效值,则会产生验证错误。
添加回答
举报
0/150
提交
取消