![](/img/trans.png)
[英]Is it possible to intercept an exception thrown from a custom annotation validator in Spring Boot?
[英]Java: custom enum validator annotation not triggered in Spring RestControllerAdvice exception handler
自定義枚舉驗證器注釋接口:
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = PanTypeSubSetValidator.class)
public @interface PanTypeSubset {
PanType[] anyOf();
String message() default "must be any of {anyOf}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
和實際實現:
public class PanTypeSubSetValidator implements ConstraintValidator<PanTypeSubset, PanType> {
private PanType[] subset;
@Override
public void initialize(PanTypeSubset constraint) {
this.subset = constraint.anyOf();
}
@Override
public boolean isValid(PanType value, ConstraintValidatorContext context) {
return value == null || Arrays.asList(subset).contains(value);
}
}
以及請求 DTO 中的用法:
@SuperBuilder
@Data
@NoArgsConstructor
public class PanBaseRequestDto {
@NotNull(message = "'PANTYPE' cannot be empty or null")
@PanTypeSubset(anyOf = {PanType.PAN, PanType.TOKEN}, message = "yesssss")
private PanType panType;
}
問題是這個注釋似乎永遠不會被觸發。 在實際驗證之前,我在 @RestControllerAdvice DefaultExceptionHandler 實現中遇到了另一個異常:
Handling generic exception: (Invalid JSON input: Cannot deserialize value of type `...pantoken.PanType` from String "PAN1": not one of the values accepted for Enum class: [TOKEN, PAN]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `...pantoken.PanType` from String "PAN1": not one of the values accepted for Enum class: [TOKEN, PAN]
通過在ENUM類中創建自定義@JsonCreator
函數來解決它。 不是最好的方法,因為我們在向最終客戶端顯示錯誤時丟失了用戶提交的值,但對我來說沒問題。
@JsonCreator
public static PanType create(String value) {
if (Objects.isNull(value)) {
return null;
}
return Arrays.stream(PanType.values())
.filter(v -> value.equals(v.getType()))
.findFirst()
.orElse(PanType.UNKNOWN);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.