代码在这里:http://github.com/knownasilya/Ambience

我正在通过index.xhtml测试持久性,并在Admin类中使用@PersistenceContext注释实例化EntityManager。每次运行此示例时,都会在em.persist(another);处获得NPE。

我的persistence.xml设置具有与Eclipse中本地数据库配置相同的连接信息。如何找出错误所在?

编辑这是相关的文件。

Index.xhtml https://github.com/knownasilya/Ambience/blob/master/g5.ambience/WebContent/index.xhtml

Admin.java https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/g5/ambience/user/admin/model/Admin.java

persistence.xml
https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/META-INF/persistence.xml

EDIT2我创建了一个UserDAO,但是当我尝试在第24行专门创建EntityManager时,仍然得到了NPE

EntityManager em = emf.createEntityManager();


出现此错误Caused by: java.lang.NullPointerException at g5.ambience.user.UserDAO.<init>(UserDAO.java:24)

UserDAO.java https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/g5/ambience/user/UserDAO.java

EDIT3我现在有3层抽象/封装。模型(用于持久性的获取器/设置器),业务逻辑和视图逻辑。

我在这里有我的实​​体工厂:http://bit.ly/HV4d11,这是一个应用程序范围的托管bean。然后,我有了ManagedUserBean http://bit.ly/In19rX,当通过UserView http://bit.ly/In1ta6(会话范围)调用getUserByUsername方法时,它仍然给我NPE。还是没有运气,该错误是关于EntityManager创建的,这是我的stackTrace:http://pastie.org/3814236

最佳答案

UserDAO必须是EJB bean,例如@Stateless使用@PersistenceContext批注。
好的设计模式是创建两层


支持bean-用于UI的托管bean,可以在XHTML中使用它们。
服务层,即您所说的DAO-实现基本业务逻辑的无状态Bean


您可以决定什么是业务逻辑以及什么是与UI相关的逻辑。

如果使用JEE6 CDI解决方案,则无需在faces-config.xml中声明托管bean。

07-27 13:17