Arhn - архитектура программирования

EJB @PersistenceContext EntityManager создает исключение NullPointerException

У меня проблема с внедрением EntityManager с помощью @PersistenceContext. Я пытаюсь внедрить EntityManager в класс EJB с помощью @PersistenceContext и всегда получаю исключение 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 дня, искал и тестировал решения в Google и в Stackoverflow, но ни одно из решений не помогло/не сработало. Чтобы убедиться, что EntityManager действительно имеет значение null, я отладил тестовый файл и увидел, что он действительно дает значение null. Итак, как я могу решить эту проблему?


Ответы:


1

Экземпляр EntityManager внедряется при развертывании EJB в контейнере. Если вы посмотрите на жизненный цикл предприятия bean, вы ясно увидите, когда произойдет внедрение зависимостей. Когда контейнер увидит аннотацию @Persistencecontext, он внедрит EntityManager, управляемый контейнером.

Проблема в том, что код, исполняемый в этом тесте, не управляется Контейнером, поэтому никто не инжектит нужные зависимости.

bookDao = new BookEJB();

Когда вы запускаете тест, класс BookEJB представляет собой просто простой POJO, аннотации @Stateless и @PersistenceContext просто игнорируются.

У вас есть несколько альтернатив для тестирования вашего EJB, взгляните на эту ссылку.

15.12.2013
  • Вау, Габриэль, это потрясающий ответ, и большое спасибо. Я решил это, добавив mockito EntityManger, и теперь он работает :). Вы говорили о моем классе EJB, что он не обрабатывался в Container в этом тестовом классе. 16.12.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..