如果我在数据库中找不到具有给定id的用户.我想返回一个异常而不是null Dto,我该怎么做?

public UserDto updateUser(Long id, UserDto userDto) {

    UserDto userDtoNew = null;

    if (userRepository.findById(id).isPresent()) {

        User existingUser = userRepository.findById(id).get();
        existingUser.setPassword(userDto.getPassword());
        existingUser.setUserName(userDto.getUserName());
        userDtoNew = userMapper.toDto(existingUser);

        return userDtoNew;
    }

    return userDtoNew;

}

推荐答案

这是使用Optional的糟糕方式.请学习如何正确使用它.

return userRepository.findById(id)
 .map(it -> {
    it.setPassword(userDto.getPassword());
    it.setUserName(userDto.getUserName());
  }).map(userMapper::toDto)
  .orElseThrow(() -> new IllegalArgumentException("No user found for " + id));

沿着这些思路,就是如何正确地使用Optional and在没有发现异常的情况下抛出异常.

理想情况下,在map函数/方法中调用的东西只是一条直线.因此,您可能希望将代码块移动到一个方法中,以使其更具可读性,而不是{}.

private User update(User user, UserDto userDto) {
  user.setPassword(userDto.getPassword());
  user.setUserName(userDto.getUserName());
  return user;
}
return userRepository.findById(id)
 .map(it -> update(it, userDto))
 .map(userMapper::toDto)
 .orElseThrow(() -> new IllegalArgumentException("No user found for " + id));

Java相关问答推荐

参数值[...]与预期类型java.util.Date不匹配

JUnit—如何模拟局部变量对象方法调用

Character::Emoji不支持带数字的字符吗?

Spring Boot@Cachebale批注未按预期工作

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

Java创建带有扩展通配符的抽象处理器

如何在Java springboot中从一个端点发送多个时间响应?

如何生成指定范围内的11位序列号?

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

使用MediaPlayer类在一段时间后停止播放音乐

接受类及其接口的Java类型(矛盾)

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

ResponseEntity.控制器截断响应的JSON部分

使用Java线程进行并行编程

将Optionals/null安全添加到嵌套的flatMap/流

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换

具有 DayOfWeek 列表的 JPA 实体

为什么单例实例持有者的循环引用不会抛出 StackOverflowError?

当小数位数已知时,BigDecimal 除法有缺点吗?