【发布时间】:2022-05-10 16:13:31
【问题描述】:
我有一个关于异常处理的简单问题。 我目前有一个应用分为多个层:控制器、服务、存储库,我的问题是:异常处理应该由控制器还是服务完成?
例子:
控制器:
@PostMapping(value = "/{id}/parents", produces = "application/json; charset=utf-8")
public ResponseEntity<AccommodationRequestDTO> resident(@PathVariable Long id, @Valid @RequestBody ParentsAndUrgencyContactDTO parentsAndUrgencyContactDTO) {
AccommodationRequestDTO saved;
try {
saved = this.service.parents(id, parentsAndUrgencyContactDTO);
} catch (Exception e) {
throw new ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
"Failed to save request", e);
}
return ResponseEntity.ok(saved);
}
服务:
public AccommodationRequestDTO parents(Long id, ParentsAndUrgencyContactDTO parentsAndUrgencyContactDTO) {
Optional<AccommodationRequest> accommodationRequest = repository.findById(id);
if (accommodationRequest.isPresent()) {
AccommodationRequest saved = accommodationRequest.get();
Parent firstParent = parentMapper.toEntity(parentsAndUrgencyContactDTO.getFirstParent());
Parent secondParent = parentMapper.toEntity(parentsAndUrgencyContactDTO.getSecondParent());
firstParent = parentRepository.save(firstParent);
secondParent = parentRepository.save(secondParent);
saved.setFirstParent(firstParent);
saved.setSecondParent(secondParent);
saved = this.repository.save(saved);
return mapper.toDTO(saved);
} else {
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, " with id " + id + " not found !");
}
}
最佳做法是什么,我应该从控制器中删除我的 try-catch 并将其放入我的服务中吗?因为使用此代码,我的 404 异常被控制器捕获覆盖。
【问题讨论】:
-
您的意思是使用像
@ControllerAdvice这样的异常处理程序的最佳实践,还是只想知道一般捕获处理的最佳实践? -
要捕获,我的控制器应该调用我的服务还是应该在里面尝试/捕获
标签: spring spring-boot