【问题标题】:NullPointer when I try to obtain list of objects当我尝试获取对象列表时出现 NullPointer
【发布时间】:2018-08-28 19:07:18
【问题描述】:

在这个问题中NullPointer when call entity Manager 建议将@Autowire DAO 添加到控制器中。我做到了,它工作正常。然后我在DaoImpl 中添加了@Transactional 注释,除了select 语句之外,每个操作插入/删除/更新都可用。当我调用这个方法时,我看到了 NPE。有人可以帮忙吗?

public List<Object[]> showAll() {
        return filmDao.getAllFilms();
    }

这是控制器的完整代码:https://pastebin.com/BNi5EH86 选择看起来像:

public List<Object[]> getAllFilms() {
    List<Object[]> all;
    EntityManager manager = getEntityManager();

    return manager.createQuery("SELECT film.id, film.tytul, film.czasTrwania, film.rozmiar, director.imieInazwisko FROM FilmDs film " +
            "JOIN DirectorDs director ON film.tytul=director.tytul").getResultList();
}

在屏幕上打印:

public void viewAll() {
        for (Object[] film : filmOperationController.showAll()) {
            Arrays.asList(film);
            System.out.print("Nr. " + film[0]
                    + ", Tytuł: " + film[1]
                    + ", Reżyser: " + film[4]
                    + ", Czas:  " + film[2]
                    + ", Wielkość pliku: " + film[3]
                    + "\n");
        }
    }

完整的堆栈跟踪:

线程“main”中的异常 java.lang.NullPointerException 在 Films.controller.FilmOperationController.showAll(FilmOperationController.java:50) 在 Films.view.ViewFilm.viewAll(ViewFilm.java:16) 在 Films.Main.showAndSearch(Main.java:40) 在 Films.Main.main(Main.java:23)

【问题讨论】:

  • 完整代码中 npe 在第 50 行。是的,我试过了,在这种情况下,filmDao 为空。
  • 其中一列是否可能为空。
  • 请出示FilmDAO的相关代码...
  • 那filmDao是spring组件吗? @Component、@Service、@Repository 注释对类定义也是如此吗?它是组件扫描的吗?您是否在 GitHub/gitlab 上有此代码,以显示更大的上下文?是否有可能其中一列为空是的,每个类都有适当的 anntotaion 每列都有数据。实体有 NotNull

标签: java spring entitymanager


【解决方案1】:

您的上下文不包含FilmDAO bean 的问题。可以添加@Autowired(required=true)查看。

发生这种情况是因为您有“interface + Impl”并且 Impl 和 interface 都被另外标记为组件(@Service@Repository)。

你可以用正确的方式修复它:只需删除FilmDAO 接口(并将那个可笑的FilmDAOImpl 重命名为正常的FilmDAO)。

【讨论】:

  • 删除注释@Service 后,我看到这样的堆栈跟踪:pastebin.com/C5AkBScp
  • 因为这不是问题。
  • @ŁukaszChojnowski,尝试删除该界面
  • @Beri 你对如何解决这个问题有什么建议吗?
  • 我尝试在本地运行该应用程序,但它不起作用,其次我没有要完全检查的架构。所以我无法正确调试它。我的提示:在 Dao 中添加日志记录,看是否输入了 FilmDaoImpl,如果是,则检查 enittyManager 是否为 notNUll,然后 getResultList() 是否返回 null。所以一步一步找到NPE线。
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多