【问题标题】:Best practices for exception in my DAO layer我的 DAO 层中异常的最佳实践
【发布时间】:2017-01-20 15:13:53
【问题描述】:

我正在处理我的 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 到表示层然后检查返回消息给用户?提前谢谢

【问题讨论】:

  • 你想通过抛出异常来解决这个问题吗?还是您愿意接受不同的解决方案?例如,您可以返回 Optional 对象而不是抛出异常。
  • 我更新了我的问题

标签: java spring exception


【解决方案1】:

关于异常处理没有硬性规定,但我的建议如下:

您必须问自己存储库的用户在查找缺少 id 时想要做什么。

如果他们想立即采取行动——例如使用后备回购——我会简单地返回一个表示“未命中”的值,例如 null 或 Optional.empty()。

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

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

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

【讨论】:

  • 非常感谢您的回答!它帮助我做出了正确的决定。
  • @DmitryNichiporenko ..你的决定是什么?
  • @Michael-O 对于未找到结果的情况,我返回了空 Optional
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为在下一层抛出异常不是更好。你可以简单地在这个方法上返回一个 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");
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多