Стеклянная рыба JPA:Проблемы с внедрением EntityManager
-
23-09-2019 - |
Вопрос
Я новичок в Java EE.Я попытался запустить несколько первых примеров (JPA).Я использую Glassfish v3.Проблема в том, что я не получаю сервер приложений, внедряющий EntityManager.Слушайте, это один из примеров http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_forкоторый я расширил с помощью клиента JSP.
Сущность:
package beans;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
private String title;
private String subtitle;
public Book() {
}
public Book(String title) {
this.title = title;
}
}
Интерфейс BookService:
package beans;
import javax.ejb.Local;
@Local
public interface BookService {
Book createOrUpdate(Book book);
void remove(Book book);
Book find(Object id);
}
BookServiceBean:
package beans;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public Book createOrUpdate(Book book) {
return em.merge(book);
}
public void remove(Book book) {
em.remove(em.merge(book));
}
public Book find(Object id) {
return em.find(Book.class, id);
}
}
персистентность.xml:
<persistence>
<persistence-unit name="sample" transaction-type="JTA">
<jta-data-source>jdbc/MarcelsDataSource</jta-data-source>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
индекс.jsp:
<%@ page import="beans.BookServiceBean" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
BookServiceBean bs = new BookServiceBean();
Book b = new Book("Superman");
bs.createOrUpdate(b);
%>
</body>
</html>
Если я запускаю пример, я получу java.lang.nullpointerException в методе createorUpdate (), чтобы EntityManager, очевидно, не вводится правильно.Я пытался найти лекарство уже несколько дней, и некоторая помощь будет высоко оценена.
Спасибо
Марсель
Решение
Вы получаете NullPointerException
потому что вы создаете экземпляр своего BookService
с new()
- что в принципе неверно - и в EJB ничего не внедряется.EJB — это компонент, который управляется контейнером и должен быть получен либо путем внедрения, либо путем поиска.
Здесь, хотя спецификация JSP позволяет запускать любой код в сценарии, вызов EJB из JSP на самом деле не рекомендуется, а JSP не поддерживают внедрение.Другими словами, вам придется использовать поиск:
<%@ page import="beans.BookService" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
BookService bs = (BookService) new InitialContext().lookup("java:module/BookServiceBean")
Book b = new Book("Superman");
bs.createOrUpdate(b);
%>
</body>
</html>
Но вам следует вызывать свой EJB из сервлета или управляемого компонента JSF (и ваш EJB можно внедрить в такие компоненты).
Если вам нужны образцы, посмотрите Примеры кода и приложения Java EE.
Обновлять: Видеть Как получить доступ к локальному компоненту EJB из POJO? в FAQ по EJB для получения более подробной информации о JNDI (особенно о новом переносимые глобальные имена JNDI, определенные спецификацией EJB 3.1.).
Другие советы
Пытаться:
@PersistenceContext(unitName = "sample")
private EntityManager em;
Вы создаете экземпляр сервисного компонента напрямую, когда вам действительно нужно, чтобы контейнер внедрил его (через @EJB).Однако это не поддерживается в JSP, поэтому вам также придется переключиться на сервлет.