在 spring 引导应用程序的服务层中正确使用 Optionals

Using Optionals correctly in service layer of spring boot application

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

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

我的问题是,

  1. 我在这里是否正确使用了Optional。并且可以在 RestController 中检查这个可选的 (isPresent()) 并且通过异常不低于 present.Like
public Optional<Questionnaire> getQuestionnaireById(Long questionnaireId) {
    return questionnaireRepository.findById(questionnaireId);
}

我采用你提到的方法 1。如果对象不存在,则抛出验证异常或其他东西。这种方法还确保服务层负责逻辑,控制器仅用于与外界交互。

我不会选择任何一个选项,尤其是第一个。您不想在您的域中引入空值。您的域应尽可能简单、可读且避免空检查等混乱。

您可能想通读所有选项的可选 API,但我个人会选择这样的内容:

在存储库中:

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