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

Java 在服务类中添加@valid时如何处理自定义注释,java,spring-boot,constraints,exceptionhandler,constraintviolationexception,Java,Spring Boot,Constraints,Exceptionhandler,Constraintviolationexception,我在实体类中使用自定义验证,@Valid对不在控制器类中的服务类进行注释,并在Spring Boot中使用自定义异常控制器(@ControllerAdvice) 当我在控制器中使用@Valid时,自定义注释抛出MethodArgumentNotValidException,我能够处理它 问题来了 当我在服务类中使用@Valid时,自定义注释停止显示异常。我想在ConstraintViolationException中处理自定义注释。我在对象级别而不是字段级别使用自定义注释。请帮助我得到的解决方案

我在实体类中使用自定义验证,
@Valid
对不在控制器类中的服务类进行注释,并在Spring Boot中使用自定义异常控制器(
@ControllerAdvice

当我在控制器中使用
@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;
}
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_请求)
@应答器
ConstraintValidationException上的ValidationErrorResponse(ConstraintViolationException e){
ValidationErrorResponse error=新的ValidationErrorResponse();
Map errorMap=newhashmap();
列表冲突=新建ArrayList();
for(ConstraintViolations冲突:e.getConstraintViolations()){
如果(!errorMap.containsKey(violation.getPropertyPath().toString())){
List errorMessages=new ArrayList();
如果(!违例。getMessage().isEmpty()){
errorMessages.add(违规.getMessage());
errorMap.put(违例。getPropertyPath().toString(),errorMessages);
}否则{
ConstraintDescriptor objEceptions=违例。getConstraintDescriptor();
添加((字符串)objEceptions.getAttributes().get(“errormessage”));
String errorField=(String)objEceptions.getAttributes().get(“errorField”);
errorMap.put(violation.getPropertyPath().toString().concat(“.”+errorField),errorMessages);
}
}否则{
errorMap.get(违例。getPropertyPath().toString()).add(违例。getMessage());
}
}
for(条目:errorMap.entrySet()){
违规违规=新违规(entry.getKey(),entry.getValue());
违规。添加(违规);
}
错误。设置违规(违规);
返回误差;
}
}

请检查这里:还有,DZone