首页 > 解决方案 > 如何使 Spring Data JPA 存储库在没有结果时返回异常?

问题描述

我正在将现有项目迁移到 Spring Data JPA 存储库。

在旧项目中,我的 DAO 如下所示:

public class MovieDAOImp implements MovieDAO {

    public Movie findByTitle(String title) throws NoResultException {
       /... query the db, if no Movie, throw new NoResultException */
    }

}

新的 Spring JPA 实现看起来像这样......

public interface MovieRepository extends JpaRepository<Movie, Integer> {

    Movie findByTitle(String title);

}

findByTitle如果没有电影,在新版本中将返回 null,但我希望它抛出异常(最好是我的 NoResultException,但任何异常都可以)。

我遇到的问题是我的所有服务都实现了预期 NoResultException 发生。

我不想重新处理我的所有服务来检查空值。

有没有办法让 JpaRepository 在没有结果时抛出异常?

标签: spring-data-jpaspring-data

解决方案


我无法找到我的问题的直接答案,所以我想出了这个解决方法......

我继续实现自己的 DAO 并在repo内部使用。

这样做的好处是让我可以完全控制 DAO 接口,包括抛出的异常,因此我不必重新处理我的服务。

但它的缺点是添加了额外的层。

public class MovieDAOImp implements MovieDAO {

    @Autowired
    private MovieRepository repo;

    public Movie findByTitle(String title) throws NoResultException {
        Movie ret = repo.findByTitle(title);
        if (ret == null) {
            throw new NoResultException("Unable to find movie by title '"+title+"'.");
        }
        return ret;    
    }

}

如果有人想出更好的方法来做到这一点,请发布答案!


推荐阅读