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