responsentityExceptionHandler未调用约束VioLationException
我有一个弹簧启动RESTFUL API,我正在为API创建错误系统。我希望能够在我的类中捕获每个错误和验证异常,以扩展RespentSentityExceptionHandler。
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
HttpHeaders defaultHttpHeaders = new HttpHeaders();
public RestResponseEntityExceptionHandler() {
this.defaultHttpHeaders.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
}
@ExceptionHandler({ ConstraintViolationException.class })
protected ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex, WebRequest request) {
logger.info("CONSTRAINT VIOLATION EXCEPTION");
List<ValidationErrorResponse.ValidationError> errors = new ArrayList<>();
List<String> tests = new ArrayList<>();
for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
tests.add(violation.getRootBeanClass().getName() + " " +
violation.getPropertyPath() + ": " + violation.getMessage());
}
return new ResponseEntity<Object>(tests, new HttpHeaders(), HttpStatus.MULTI_STATUS);
}
@ExceptionHandler(value = {IncidentologistNotFoundException.class, UserNotFoundException.class, ReturnRequestNotFoundException.class})
protected ResponseEntity<Object> handleEntityNotFoundException(RuntimeException ex, WebRequest request) {
ErrorResponse errorResponse = new ErrorResponse(
ErrorTypes.ENTITY_NOT_FOUND,
HttpStatus.NOT_FOUND,
"The entity has not been found",
ex.getMessage()
);
return handleExceptionInternal(ex, errorResponse, new HttpHeaders(), errorResponse.getStatus(), request);
}
}
handletityNotFoundException()
正常工作。
但是,handleconstraintViolation()
完全不调用与约束维数有关的所有异常。我不知道为什么,因为我在控制器中标记了@requestbody的@valid注释:
@PostMapping("/return-requests")
ResponseEntity<?> postReturnRequest(@Valid @RequestBody MutateReturnRequestDto newReturnRequest) {
Incidentologist requester = incidentologistRepository.findById(newReturnRequest.getIcRequesterId())
.orElseThrow(() -> new IncidentologistNotFoundException(newReturnRequest.getIcRequesterId()));
ReturnRequest returnRequest = manuallyConvertToEntity(newReturnRequest);
returnRequest.setIcRequester(requester);
ReturnRequest createdReturnRequest = returnRequestService.createReturnRequest(returnRequest);
return new ResponseEntity<>(convertToDto(createdReturnRequest), HttpStatus.CREATED);
}
I have a Spring Boot RESTful API and I am creating the error system for my API. I want to be able to catch each errors and each validation exceptions in my class that extend ResponseEntityExceptionHandler.
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
HttpHeaders defaultHttpHeaders = new HttpHeaders();
public RestResponseEntityExceptionHandler() {
this.defaultHttpHeaders.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
}
@ExceptionHandler({ ConstraintViolationException.class })
protected ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex, WebRequest request) {
logger.info("CONSTRAINT VIOLATION EXCEPTION");
List<ValidationErrorResponse.ValidationError> errors = new ArrayList<>();
List<String> tests = new ArrayList<>();
for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
tests.add(violation.getRootBeanClass().getName() + " " +
violation.getPropertyPath() + ": " + violation.getMessage());
}
return new ResponseEntity<Object>(tests, new HttpHeaders(), HttpStatus.MULTI_STATUS);
}
@ExceptionHandler(value = {IncidentologistNotFoundException.class, UserNotFoundException.class, ReturnRequestNotFoundException.class})
protected ResponseEntity<Object> handleEntityNotFoundException(RuntimeException ex, WebRequest request) {
ErrorResponse errorResponse = new ErrorResponse(
ErrorTypes.ENTITY_NOT_FOUND,
HttpStatus.NOT_FOUND,
"The entity has not been found",
ex.getMessage()
);
return handleExceptionInternal(ex, errorResponse, new HttpHeaders(), errorResponse.getStatus(), request);
}
}
The handleEntityNotFoundException()
works as excepted.
However, handleConstraintViolation()
which is supposed to catch all the exceptions related to the ConstraintViolation is not called at all. I do not know why, because, I marked my @RequestBody with the @Valid annotation in my controller:
@PostMapping("/return-requests")
ResponseEntity<?> postReturnRequest(@Valid @RequestBody MutateReturnRequestDto newReturnRequest) {
Incidentologist requester = incidentologistRepository.findById(newReturnRequest.getIcRequesterId())
.orElseThrow(() -> new IncidentologistNotFoundException(newReturnRequest.getIcRequesterId()));
ReturnRequest returnRequest = manuallyConvertToEntity(newReturnRequest);
returnRequest.setIcRequester(requester);
ReturnRequest createdReturnRequest = returnRequestService.createReturnRequest(returnRequest);
return new ResponseEntity<>(convertToDto(createdReturnRequest), HttpStatus.CREATED);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论