我已經(jīng)實(shí)現(xiàn)了 ConstraintValidator 以驗(yàn)證包含枚舉的 DTO。為此,我遵循了這個 Spring 文檔。這是要應(yīng)用于枚舉字段的自定義注釋:@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = EnumValidator.class)public @interface ValidEnum { String message() default "{com.test.validation.constraints.ValidEnum}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; Class<? extends Enum<?>> target();}該EnumValidator如下所示:public class EnumValidator implements ConstraintValidator<ValidEnum,String> { private Set<String> enumValues; @Override public void initialize(ValidEnum targetEnum) { Class<? extends Enum> enumSelected = targetEnum.targetClassType(); enumValues = (Set<String>) EnumSet.allOf(enumSelected).stream() .map(e -> ((Enum<? extends Enum<?>>) e).name()).collect(Collectors .toSet()); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return enumValues.contains(value); } }這是枚舉:public enum Gender { MALE,FEMALE;}這是要驗(yàn)證的 DTO:public final class UserDTO{ @ValidEnum(target = Gender.class) private Gender gender; @NotEmpty @Max(100) private String fullName;}以及驗(yàn)證該字段的控制器:@Controllerpublic class RegistrationController { private static final String REGISTER_USER = "/register"; private final RegistrationService registrationService; @PostMapping(value = REGISTER_USER) @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) public UserRegistrationResponse register(@Valid UserDTO userRegistrationRequest) { return registrationService.register(userRegistrationRequest); }}Spring似乎沒有檢測到驗(yàn)證器,因?yàn)樗鼟伋隽诉@個異常:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: 我正在使用 Spring boot 2.0.4,其中包含驗(yàn)證所需的依賴項(xiàng)。知道為什么會失敗嗎?
javax.validation.UnexpectedTypeException
慕無忌1623718
2021-08-25 15:14:29