我是spring boot应用程序开发的新手.我在应用程序中使用了服务层,但遇到了返回可选的存储库方法,如下所示.

 @Override
public Questionnaire getQuestionnaireById(Long questionnaireId) {
    Questionnaire returnedQuestionnaire = null;
    Optional<Questionnaire> questionnaireOptional = questionnaireRepository.findById(questionnaireId);
    if(questionnaireOptional.isPresent()) {
        returnedQuestionnaire = questionnaireOptional.get();
    }
    return returnedQuestionnaire;
}

我的问题是,

  1. 我在这里是否正确使用了可选选项.在RestController中判断这个可选的(isPresent())是否可以,并且直通异常不存在.就像下面
public Optional<Questionnaire> getQuestionnaireById(Long questionnaireId) {
    return questionnaireRepository.findById(questionnaireId);
}

推荐答案

我不会 Select 任何一种,尤其是第一种.您不想在域中引入空值.您的域逻辑应该保持简单,并且不应该包含为获得最佳可读性而进行的空判断.

您可能想通读所有选项的可选API,但就个人而言,我会 Select 以下内容:

在存储库中:

public interface TodoBoardRepository {

    Optional<Questionnaire> findByQuestionnaireId(String questionnaireId);

    // ...

}

在职:

@Service
@RequiredArgsConstructor // Or generate constructor if you're not using Lombok
public class QuestionnaireService {
    private final QuestionnaireRepository questionnaireRepository;

    // ...

    public Questionnaire getQuestionnaireById(Long questionnaireId) {
        Questionnaire questionnaire = questionnaireRepository.findById(questionnaireId)
            .orElseThrow(() -> new QuestionaireNotFoundException(questionnaireId));
        // Do whatever you want to do with the Questionnaire...
        return questionnaire;
    }
}

Java相关问答推荐

Selenium Java:无法访问IFRAME内部的元素

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

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

使用标记时,场景大纲不在多个线程上运行

现场观看Android Studio中的变化

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

Spring @Value default无法计算表达式

使用UTC时区将startDatetime转换为本地时间

如何仅使用键/ID的一部分(组合)高效地返回映射值?

如何在 spring 数据的MongoDB派生查询方法中使用$EXISTS

舰队运行配置Maven版本

AbstractList保证溢出到其他方法

在JDK Flight Recorder中只记录单个线程

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

窗口启动后不久,从java.awt.Graphics disapear创建的矩形

睡眠在 Spring Boot 中

如何在 Android Studio 中删除 ImageView 和屏幕/父级边缘之间的额外空间?