spring - 如果物品不存在,应该返回什么?
问题描述
鉴于此代码:
@GetMapping("/data/{id}")
public Data retrieveDataById(@PathVariable Long id) {
Optional<Data> data = dataService.findById(id);
if(data.isEmpty()){
return null;
}
else {
return data.get();
}
}
我认为的主要问题是,null
如果找不到该项目,则会被退回。
所以,而不是
if(data.isEmpty()){
return null;
}
我计划将其更改为:
if(data.isEmpty()){
ResponseEntity.ok("No records found for id"+id);
}
这是正确的还是我应该考虑其他更改?
更新:
更改导致返回类型从 更改Data
为ResponseEntity
。如果数据存在,我应该添加data.get();
吗?ResponseEntity
改变
解决方案
从控制器返回时包装响应会更好
@GetMapping("/{id}")
public ResponseEntity<RoleDto> findById(@PathVariable String id) {
return ResponseEntity.ok(roleService.findById(id));
}
对于服务层,在以后处理这种情况时,返回带有相关错误消息的自定义异常会更加灵活。
public RoleDto findById(String id) {
Optional<Role> role = roleRepository.findById(id);
return role.map(roleMapper::toDto).orElseThrow(() -> new ResourceNotFoundException(id, "Role not found"));
}
通过实现 Spring 5 中的 @ControllerAdvice、控制器级别 @ExceptionHandler 或 ResponseStatusException,可以根据最终用户要求处理自定义异常
更改导致返回类型从 Data 更改为 ResponseEntity。我应该添加 data.get(); 如果数据存在,则到 ResponseEntity 上?改变
是的你可以。通常你可以在服务层做这个操作,并将DTO返回给相关的控制器。
推荐阅读
- python - 导入 spacy 导致错误:ModuleNotFoundError: No module named 'email.parser'; '电子邮件不是包裹
- java - Spring Batch - 保持服务器运行
- swift - 从 MTLTexture (Swift, macOS) 制作 CGImage 时的内存泄漏
- c++ - C++中赋值运算符重载函数的正确使用?
- ios - 如何将 URL 数组转换为字符串数组?
- javascript - Google Maps API - 缩放按钮不响应鼠标点击
- jquery - asp.net 使用 jQuery 一次将多个数据发布到多个表中
- python - 如何计算python中每一行上具有值的列数?
- c# - 构造函数参数过多的 Unity 注入
- javascript - 构建命运之轮游戏,我试图让按键事件来检测随机单词数组中的一个字母