我的DAO层中的异常的最佳做法

时间:2017-01-20 15:13:53

标签: java spring exception

我正在处理我的dao层实现,我对异常处理部分感到困惑。我有很多解决方案来抛出异常,所以在dao层中处理异常的最佳解决方案是什么:

这是我的代码:

我的DAO界面:

@Repository
@Transactional
public interface GnqstRepository<T,V>  {

   public  T save(T t);
   public  void delete(V v)throws GnqstRepositoryNotFoundException;
   public  T update(T t); 
   public  T find(V v)throws GnqstRepositoryNotFoundException;
   public  List<T> findAll();


}

这是我的实体实现:

public class EnqueteurRepository implements GnqstRepository<Enqueteur, Long> {
    @PersistenceContext(name="gnst")
    private EntityManager em ;

    private static final Logger logger = Logger.getLogger(EnqueteurRepository.class);


    @Override
    public Enqueteur find(Long v)throws GnqstRepositoryNotFoundException {
        Enqueteur enqueteur = em.find(Enqueteur.class,v);
        if(enqueteur!= null){
            logger.info("EnqueteurRepository : l'enqueteur avec l'ID : "+v+" a été trouvé avec succès.");
            return enqueteur;
        }
        else{
            throw new GnqstRepositoryNotFoundException("L'identifiant entré ne ressemble pas à un ID enqueteur valide.");
        }
    }
}

这里我创建一个已检查的异常我的问题是否有最好的方法将异常抛出到下一层,例如find方法找不到实体?

我的目标是IHM中的用户在点击按钮时找到搜索结果,如果没有找到结果,那么在我的情况下IHM中应该显示一条消息我通过dao层,业务层到表示层我抛出异常问题是谁最好抛出一个异常或者返回null到表示层然后检查一条返回消息给用户?感谢提前

3 个答案:

答案 0 :(得分:4)

javax.persistence.EntityNotFoundException出了什么问题?这是一个有争议的问题,但如果我是你,我会保持接近JPA并避免添加自定义异常。我也会避免改变行为。在JPA中,如果缺少实体,则find方法返回null。 find方法的用户可能会发现收到异常会让人感到困惑。我将返回null或将方法重命名为findRequired。

答案 1 :(得分:3)

关于异常处理没有严格的规则,但这些是我的建议:

您必须问自己,当他们使用缺少的ID进行查找时,您的存储库用户会想要做什么。

如果他们想立即采取行动 - 例如使用后备回购 - 我只会返回一个代表“miss”的值,例如null或Optional.empty()。

如果您希望错误在应用程序中传播多个层,并且可能呈现404或中止正在运行的程序,我会使用异常。

如果您不想以不同方式处理来自不同存储库的异常,我会坚持使用标准的EntityNotFoundException。如果你想以不同的方式处理它们,我会介绍我自己的RuntimeExceptions。

今天很少使用已检查的例外情况。它们存在于表示失败和抛出异常的返回值之间的边界。我相信社会上的共识是,他们听起来是个好主意,但在实践中却很糟糕。所以我会避免它们。

答案 2 :(得分:2)

我不喜欢在下一层抛出异常。你可以简单地在这个方法上返回一个Optional:

public class EnqueteurRepository implements GnqstRepository<Enqueteur, Long> {
    @PersistenceContext(name="gnst")
    private EntityManager em ;

    @Override
    public Optional<Enqueteur> find(Long v) {
        return Optional.ofNullable(em.find(Enqueteur.class,v));      
    }
}

然后,可以在下一层中抛出自定义异常。

void methodCallingDao() {
  Optional<Enqueteur> enqueteur = enqueteurRepository.find(new Long(1));
  if(!enqueteur.isPresent()) {
    throw new RuntimeException("Error retrieving enqueteur");
  }
}