我需要驗證我的 DTO bean 將枚舉作為一個字段,為了達到相同的目的,我遵循了此處提供的一些解決方案,但 json 反序列化甚至在到達我的自定義驗證器之前就失敗了。其他開發(fā)人員在此處提供的解決方案。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條經(jīng)驗 獲得超9個贊
要應(yīng)用驗證,您需要使用 @Valid annotaion。您必須缺少 @Valid 這就是您的驗證不起作用的原因。
稍后還有一個問題。在您的 DTO WidgetTypeAddOrUpdateDTO 中,枚舉值持有者變量是 IsActive 類型,它是一個枚舉。當 spring 將從 JSON 填充/反序列化 DTO 時,如果枚舉值無效,它將拋出異常,因此您需要將其更改為 String 類型。一旦將其更改為 String,則 string 可以包含任何文本,但您的驗證將受到限制,如果存在無效值,則會產(chǎn)生驗證錯誤。
添加回答
舉報
0/150
提交
取消