收到此錯誤HV000030: No validator could be found for constraint EnumChecker validating type MyEnum Check configuration for ‘myenum’。
使用該類上的注釋進行驗證,我不能這樣做,private final String myenum因為我需要將其用作列舉才能使用列舉內部的函式
public class Request {
@EnumChecker(enumclass = MyEnum.class)
private final MyEnum myenum;
}
注解
@Documented
@Constraint(validatedBy = MyEnumValidator.class)
@Target({FIELD, PARAMETER, TYPE, TYPE_USE, TYPE_PARAMETER, METHOD, CONSTRUCTOR, ANNOTATION_TYPE})
@Retention(RUNTIME)
public @interface EnumChecker {
String message() default "must be one of these values";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends Enum> enumClass();
}
驗證器
public class MyEnumValidator implements ConstraintValidator<EnumChecker, String> {
private List<String> validEnumList;
@Override
public void initialize(EnumChecker constraintAnnotation) {
validEnumList = Arrays.stream(constraintAnnotation.enumClass().getEnumConstants())
.map(Enum::name)
.collect(Collectors.toList());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return validEnumList.contains(value);
}
}
列舉
public enum MyEnum {
YES, NO;
private static final Map<MyEnum, String> MyEnumConverter =
Map.of(YES, "yes");
public String toMyString() {
return MyEnumConverter.get(this);
}
}
uj5u.com熱心網友回復:
首先洗掉final修飾符myenum并為該欄位創建setter和getter,因為例如Jackson無法將http請求中的值系結到您的Request類。
public class Request {
@EnumChecker(enumClass = MyEnum.class)
private MyEnum myenum;
public MyEnum getMyenum() {
return myenum;
}
public void setMyenum(MyEnum myenum) {
this.myenum = myenum;
}
}
然后將ConstraintValidator目標型別更改為匹配MyEnum而不是String
public class MyEnumValidator implements ConstraintValidator<EnumChecker, MyEnum> {
private List<MyEnum> validEnumList;
@Override
public void initialize(EnumChecker constraintAnnotation) {
validEnumList = Arrays.stream(constraintAnnotation.enumClass().getEnumConstants())
.collect(Collectors.toList());
}
@Override
public boolean isValid(MyEnum value, ConstraintValidatorContext context) {
return validEnumList.contains(value);
}
}
測驗:我做了以下測驗
@RestController
public class MainController {
@PostMapping("/annot")
public String filter(@RequestBody @Valid Request req) {
return req.getMyenum().name();
}
}
此外,我將實作更改MyEnumValidator為僅查看驗證效果并證明其發生。(我承認目前這個驗證器沒有意義。也只使用只能 擁有或值@RequestBody的保證,否則會引發例外)myenumYESNO
public class MyEnumValidator implements ConstraintValidator<EnumChecker, MyEnum> {
private List<MyEnum> validEnumList;
@Override
public void initialize(EnumChecker constraintAnnotation) {
validEnumList = Arrays.stream(constraintAnnotation.enumClass().getEnumConstants())
.collect(Collectors.toList());
}
@Override
public boolean isValid(MyEnum value, ConstraintValidatorContext context) {
return validEnumList.contains(value) && value.name().length() == 3;
}
}

對于無效的情況:

堆疊跟蹤:
Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String api.sweater.controller.MainController.filter(api.sweater.request.Request): [Field error in object 'request' on field 'myenum': rejected value [NO]; codes [EnumChecker.request.myenum,EnumChecker.myenum,EnumChecker.api.sweater.request.MyEnum,EnumChecker]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [request.myenum,myenum]; arguments []; default message [myenum],class api.sweater.request.MyEnum]; default message [must be one of these values]] ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/461384.html
