我已经实现了自定义大小验证,以便将“ errorCode”添加到验证错误中。
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { StringLengthValidator.class })
public @interface StringLength {
String message() default "Size must be between {min} and {max}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
long min() default 0L;
long max();
String errorCode() default "";
}
我在DTO中用以下注释了一个字段:
@StringLength(min = 5, max = 400, errorCode = "1000001")
在@RestControllerAdvice
中,我添加了以下内容:
@ExceptionHandler({WebExchangeBindException.class})
Mono<ResponseEntity<...>> webExchangeBindException(WebExchangeBindException exception, ServerHttpRequest request) {
...
}
如何获取原始注释的errorCode以便将其添加到响应中?
我发现exception.getFieldError().getArguments()
包含一个数组,该数组的值要包装在SpringValidatorAdapter.ResolvableAttribute
中,但是我不知道如何使用它。
答案 0 :(得分:0)
使用此验证时,您可以粘贴控制器的代码吗?
答案 1 :(得分:0)
我能想到的最好的办法是将javax.validation.Validator
注入到@RestControllerAdvice
中,然后使用以下@ExceptionHandler
来获得验证注释的“ errorCode”值。
@ExceptionHandler({WebExchangeBindException.class})
Mono<ResponseEntity<...>> webExchangeBindException(WebExchangeBindException exception, ServerHttpRequest request) {
Set<ConstraintViolation<Object>> violations = validator.validate(exception.getTarget());
violations.stream()
.findFirst()
.ifPresent(violation -> /*Assign error here */ ... violation.getConstraintDescriptor().getAttributes().get("errorCode"));
return ...;
}
这行得通,但我认为应该有更好的方法来做到这一点。