首页 > 解决方案 > 如果物品不存在,应该返回什么?

问题描述

鉴于此代码:

@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);
    }

这是正确的还是我应该考虑其他更改?

更新:

更改导致返回类型从 更改DataResponseEntity。如果数据存在,我应该添加data.get();吗?ResponseEntity改变

标签: springspring-boot

解决方案


从控制器返回时包装响应会更好

@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返回给相关的控制器。


推荐阅读