Spring中如何为已定义接口响应自定义消息,替换空数据实体返回提示
解决方案
你当前的核心问题是直接返回数据库映射实体Health的集合,结构被实体类固定,无法兼容两种不同的返回结构,按以下步骤修改即可:
第一步 调整返回值类型
不要直接返回List<Health>,改为返回通用的List<?>或者List<Map<String, Object>>,用来承载两种不同结构的返回项;如果追求规范也可以自定义两个DTO类:
- 健康数据有效时返回
HealthDTO(和现有Health实体字段一致) - 无有效数据时返回
EmptyHealthDTO(仅包含uuid和message两个字段)
第二步 补充判断逻辑、组装返回结果
你原有代码还存在逻辑遗漏:如果关联用户存在但没有有效健康数据,当前逻辑不会返回任何该用户的条目,不符合需求,修改后的代码如下:
@GetMapping("/monitored") @PreAuthorize("hasRole('USER') and hasRole('RESPONSIBLE')") public Object returnMonitored() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Optional<User> loginUserOpt = userRepository.findByUsername(auth.getName()); // 登录用户不存在直接返回错误 if (loginUserOpt.isEmpty()) { return ResponseEntity.ok().body(new MessageVo("用户不存在")); } User loginUser = loginUserOpt.get(); List<Dependency> uuids = dependencyRepository.returnAllUserUuid(loginUser.getUuid()); // 定义通用返回集合 List<Object> result = new ArrayList<>(); uuids.forEach(uuid -> { String userUuid = uuid.getUserUuid(); // 先判断用户是否存在 if (!userRepository.existsByUuid(userUuid)) { return; } // 判断该用户是否有有效健康数据 if (healthRepository.existsByUuid(userUuid) && healthRepository.isRegistered(userUuid)) { List<Health> healthList = healthRepository.returnAllUserUuid(userUuid); // 遍历每个健康数据判断是否有效 for (Health health : healthList) { // 核心字段都为null视为无效数据 if (health.getHearthBeat() == null && health.getStatus() == null && health.getDate() == null && health.getLatitute() == null && health.getLongitude() == null && health.getCardiacSteps() == null) { // 封装无有效数据的返回项 Map<String, Object> emptyItem = new HashMap<>(); emptyItem.put("uuid", userUuid); emptyItem.put("message", "该用户无有效数据"); result.add(emptyItem); } else { // 有效数据直接加入 result.add(health); } } } else { // 没有健康数据的情况直接返回提示 Map<String, Object> emptyItem = new HashMap<>(); emptyItem.put("uuid", userUuid); emptyItem.put("message", "该用户无有效数据"); result.add(emptyItem); } }); if(result.isEmpty()) { return ResponseEntity.ok().body(new MessageVo("你未关联任何负责的用户 ;) ")); } return result; }
第三步 可选优化(推荐)
如果不想用Map这种松散结构,可以自定义公共接口统一返回类型:
// 定义公共返回接口 public interface HealthResult {} // 有效健康数据DTO实现该接口 public class HealthDTO implements HealthResult { // 原有Health实体的所有字段 private Integer id; private String uuid; // 其余字段、getter setter省略 } // 无有效数据DTO实现该接口 public class EmptyHealthDTO implements HealthResult { private String uuid; private String message; // getter setter省略 }
之后把返回集合类型改为List<HealthResult>即可,结构更规范,也方便后续扩展。
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

