服务和控制器层异常处理设计模式

问题描述 投票:0回答:1

所以这是我当前实现的rest-api端点,我想处理某种极端情况,例如找不到用户或平板,所以我会抛出和适当的异常,但是如何显示我处理它控制器?现在它并没有真正起作用,如果我设置了一个不存在的id,它将像往常一样工作,并且我没有得到对应的错误消息。

服务层:

public void delete(Long flatId) {
        flatRepository.findById(flatId).ifPresentOrElse(flat -> {
                    List<User> residents = flat.getResidents();
                    residents.forEach(resident -> resident.setFlat(null));
                    flatRepository.delete(flat);
                },
                () -> new ResourceNotFoundException("Flat " + flatId + " found"));

}

控制器层:

@DeleteMapping("/flats/{flatId}")
    public void deleteFlat(@PathVariable Long flatId) {
        flatService.delete(flatId);
}

GlobalExceptionHandler:

@ControllerAdvice
@RestController
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public final ErrorDetails handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ErrorDetails(LocalDateTime.now(), ex.getMessage(), 404);
    }

    @ExceptionHandler(ResourceAlreadyDefinedException.class)
    @ResponseStatus(HttpStatus.CONFLICT)
    public final ErrorDetails handleResourceAlreadyDefinedException(ResourceAlreadyDefinedException ex) {
        return new ErrorDetails(LocalDateTime.now(),  ex.getMessage(), 409);
    }

}

更新:我创建了这个全局异常处理程序,但是如果我向我的api发送一个删除请求,并且不存在id,它就不会发送给我404它只会回复200.而如果我有一个像这样的返回值,它按预期工作。

        public Flat get(Long id) {
                return flatRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Flat " + id + " not found"));
        }


     @GetMapping("/flats/{flatId}")
        public ResponseEntity<Flat> getFlat(@PathVariable Long flatId) {
            return ResponseEntity.ok(flatService.get(flatId));
     }
spring rest spring-boot controller layer
1个回答
2
投票

您可以将@ControllerAdvice@ExceptionHandler一起使用,以便为所有控制器和特定类型的异常实现全局异常处理。

here为例。

© www.soinside.com 2019 - 2024. All rights reserved.