在 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;
}
我的问题是,
- 我在这里是否正确使用了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;
}
}
我是 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;
}
我的问题是,
- 我在这里是否正确使用了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;
}
}