gpt4 book ai didi

java - 如何在服务类中添加@valid时处理自定义注释

转载 作者:行者123 更新时间:2023-12-01 19:19:58 24 4
gpt4 key购买 nike

我在实体类中使用自定义验证,在服务类上使用@Valid注释,而不是在 Controller 类中使用,以及Spring Boot中的自定义异常 Controller (@ControllerAdvice)。

当我在 Controller 中使用@Valid时,自定义注释抛出MethodArgumentNotValidException,我能够处理它。

问题来了当我在服务类中使用 @Valid 时,自定义注释停止抛出异常。我想处理 ConstraintViolationException 中的自定义注释。我在对象级别而不是字段级别使用自定义注释。请帮忙

最佳答案

我得到的解决方案如下所示:

@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
ValidationErrorReponse onConstraintValidationException(ConstraintViolationException e) {
ValidationErrorReponse error = new ValidationErrorReponse();
Map<String, List<String>> errorMap = new HashMap<>();
List<Violation> violations = new ArrayList<>();
for (ConstraintViolation<?> violation : e.getConstraintViolations()) {
if (!errorMap.containsKey(violation.getPropertyPath().toString())) {
List<String> errorMessages = new ArrayList<>();
if(!violation.getMessage().isEmpty()) {
errorMessages.add(violation.getMessage());
errorMap.put(violation.getPropertyPath().toString(), errorMessages);
}else {
ConstraintDescriptor<?> objEceptions = violation.getConstraintDescriptor();
errorMessages.add((String)objEceptions.getAttributes().get("errormessage"));
String errorField = (String)objEceptions.getAttributes().get("errorField");
errorMap.put(violation.getPropertyPath().toString().concat("."+errorField), errorMessages);
}
} else {
errorMap.get(violation.getPropertyPath().toString()).add(violation.getMessage());
}
}
for (Entry<String, List<String>> entry : errorMap.entrySet()) {
Violation violation = new Violation(entry.getKey(), entry.getValue());
violations.add(violation);
}
error.setViolations(violations);
return error;
}

}

关于java - 如何在服务类中添加@valid时处理自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59368608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com