spring 引导中的可选 class?

Optional class in spring boot?

我正在开发一个管理帐户的应用程序。我制作了一个名为 org.sid.entities 的包,其中存在 IBanqueJob 接口及其代码

package org.sid.metier;

import org.sid.entities.Compte;
import org.sid.entities.Operation;
import org.springframework.data.domain.Page;

public interface IBanqueMetier {
    public Compte consulterCompte(String CodeCompte);
    public void verser(String CodeCompte,double mt);
    public void retirer(String CodeCompte, double mt);
    public void virement(String Cp1, String Cp2, double mt);
    public Page<Operation> listOperation(String cp,int page,int size);


}

以及这个接口的实现,下面是它的代码

package org.sid.metier;

import java.util.Date;

import org.sid.dao.CompteRepository;
import org.sid.dao.OperationRepository;
import org.sid.entities.Compte;
import org.sid.entities.Operation;
import org.sid.entities.Versement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class BanqueMetierImpl implements IBanqueMetier {
    @Autowired
    private CompteRepository compteRepository;
    @Autowired
    private OperationRepository operationRepository;

    @Override
    public Compte consulterCompte(String CodeCompte) {


       Compte cp = compteRepository.findById(CodeCompte);

         if (cp == null)
            throw new RuntimeException("compte introuvable");
        return cp;
    }

我在下面的这一行中有一个错误,上面写着 "Type mismatch: cannot convert from Optional to Compte "

Compte cp = compteRepository.findById(CodeCompte);

compteRepository.findById returns 一个 Optional,因为它可能实现了 CrudRepository 接口。

所以请使用

Optional<Compte> cp = compteRepository.findById(CodeCompte);

findById returns 某物的 Optional,这意味着对于给定的 id 我们要么只有一个结果,要么我们没有任何结果.

为了解压这个Optional,我通常建议做的是:

Compte cp = compteRepository.findById(CodeCompte).orElseThrow(() -> new Exception("Element not found!");

如果我们没有找到该特定 ID 的任何内容,这将引发异常。

在某些情况下return一些默认值比抛出异常更有利。在这种情况下,我们可以使用:

Compte cp = compteRepository.findById(CodeCompte).orElse(new Compte());

或供应商:

Compte cp = compteRepository.findById(CodeCompte).orElseGet(() -> new Compte());