【问题标题】:EJB @PersistenceContext EntityManager Throws NullPointerExceptionEJB @PersistenceContext EntityManager 抛出 NullPointerException
【发布时间】:2013-12-15 09:07:02
【问题描述】:

我在使用 @PersistenceContext 注入 EntityManager 时遇到问题。我尝试使用 @PersistenceContext 在 EJB 类中注入 EntityManager,但我总是得到 NullPointerException。

这里是 EJB 类:

@Stateless
public class BookEJB {

public BookEJB(){

}

@PersistenceContext(unitName = "BookWebStorePU")
private EntityManager em;

public Book createBook(Book book) throws Exception {
    System.out.println("EM: " + em);
    em.persist(book);
    return book;
}

public Book findBookByIsbn10(String isbn10){
    Book book = new Book();
    em.find(Book.class, isbn10);
    return book;
}
//Other methods here
}

这里是 Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="BookWebStorePU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<validation-mode>NONE</validation-mode>
<properties>
  <property name="javax.persistence.schema-generation.database.action" value="create"/>
  <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
  <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/BookWebStoreDB"/>
  <property name="javax.persistence.jdbc.user" value="bookwebstoreadmin"/>
  <property name="javax.persistence.jdbc.password" value="password"/>
  <!-- Let EclipseLink create database schemas automatically -->
  <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
  <property name="eclipselink.ddl-generation.output-mode" value="database"/>
</properties>

这是我的测试文件:

public class BookDaoTests {

private BookEJB bookDao;
private Book newBook;

@Before
public void init() {

    newBook = new Book();      
    newBook.setName("Flying Cow");
    newBook.setDescription("Super cool story about flying cow");
    newBook.setAuthor("Me");
    newBook.setIsbn10("0123456789");
    newBook.setIllustrations(true);
    newBook.setPublishYear(2013);
    newBook.setNumberOfPages(1567);
    newBook.setQuantity(58);

    bookDao = new BookEJB();

}

@Test
public void createBook() throws Exception{
    bookDao.createBook(newBook);
    Assert.assertEquals("Book was created!", bookDao.findBookByIsbn10("0123456789"), newBook);
}


}

因此,当我运行该测试文件时,出现以下错误:

Testcase: createBook(com.mysite.bookstore.tests.BookDaoTests): Caused an ERROR
null
java.lang.NullPointerException
at com.mysite.bookwebstore.beans.BookEJB.createBook(BookEJB.java:27)
at com.mysite.bookstore.tests.BookDaoTests.createBook(BookDaoTests.java:46)

EM: null

我使用以下技术:

  • 玻璃鱼 4
  • JavaEE 7
  • JSF
  • EclipseLink 2.1
  • Java 数据库

我希望我们能找到解决这个问题的方法。我已经解决了 3 天的这个问题,并从谷歌和 Stackoverflow 搜索和测试了解决方案,但没有一个解决方案有帮助/有效。为了确保 EntityManager 确实为 null,我调试了测试文件并看到它确实给出了 null。那么我该如何解决这个问题呢?

【问题讨论】:

    标签: nullpointerexception ejb persistence


    【解决方案1】:

    EntityManager 实例是在 EJB 部署到容器中时注入的。 如果你看一下企业bean的lifecycle,你就会清楚地看到什么时候发生了依赖注入。 当 Container 看到 @Persistencecontext 注解时,它会注入一个容器管理的 EntityManager。

    问题是在这个测试中执行的代码不是由Container管理的,因此没有人注入必要的依赖。

    bookDao = new BookEJB();
    

    运行测试时,BookEJB 类只是一个简单的 POJO,@Stateless 和 @PersistenceContext 注释被简单地忽略。

    您有多种选择来测试您的 EJB,看看这个link

    【讨论】:

    • 哇,加布里埃尔,答案真棒,非常感谢。我通过添加 EntityManger 的模拟来解决它,现在它可以工作了:)。你是关于我的 EJB 类,它没有在那个测试类的 Container 中处理。
    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2016-09-04
    • 2021-01-31
    相关资源
    最近更新 更多