Spring端点查询数据库无数据时,如何返回空NotificationNewDTO对象?
实现返回空NotificationNewDTO的Spring端点
当然可以实现这个需求!你只需要调整原代码中处理空结果的逻辑,把返回404的逻辑替换成返回一个空的NotificationNewDTO实例即可,同时保持200的成功状态码。
修改后的代码示例
@GetMapping("/notification/{id}") public ResponseEntity<NotificationNewDTO> getNotificationByTransactionId(@PathVariable Integer id) { // 从数据库查询并映射为DTO,无数据时返回空DTO NotificationNewDTO responseDto = notificationService .findByTransactionId(id) .map(notification -> NotificationNewDTO.builder() .id(notification.getId()) .status(notification.getStatus()) .updated_at(notification.getUpdated_at()) .build() ) .orElse(NotificationNewDTO.builder().build()); // 关键:无数据时生成空DTO return ResponseEntity.ok(responseDto); }
关键调整说明
- 明确返回类型:把原来的
ResponseEntity<?>改为ResponseEntity<NotificationNewDTO>,让接口契约更清晰,避免类型通配符带来的模糊性。 - 替换空结果处理逻辑:用
orElse()替代原代码中的orElseGet(() -> notFound().build()),当findByTransactionId(id)返回空Optional时,通过builder模式创建一个空的NotificationNewDTO对象。 - 统一返回状态:不管数据库中是否存在对应数据,都返回200状态码和对应的DTO(有数据则返回填充后的DTO,无数据则返回空DTO)。
另一种链式写法(更简洁)
如果你偏好保持链式调用的风格,也可以这样写:
@GetMapping("/notification/{id}") public ResponseEntity<NotificationNewDTO> getNotificationByTransactionId(@PathVariable Integer id) { return ResponseEntity.ok( notificationService.findByTransactionId(id) .map(notification -> NotificationNewDTO.builder() .id(notification.getId()) .status(notification.getStatus()) .updated_at(notification.getUpdated_at()) .build() ) .orElse(NotificationNewDTO.builder().build()) ); }
这两种写法都能满足你的需求,核心思路就是用orElse提供空DTO实例,而不是返回404响应。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

