2010-03-01 6 views
1

Я новичок в Java EE. Я попытался запустить некоторые первые примеры (JPA). Я использую Glassfish v3. Проблема в том, что я не получаю сервер приложений, вводя EntityManager. Слушайте один пример http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_for , который я продлил с помощью JSP-клиента.Glassfish JPA: Проблемы с инъекциями EntityManager

Entity:


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); 
    } 
} 

persistence.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> 

index.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 является явно не введен правильно. Я попытался найти лекарство в течение нескольких дней и . Некоторая помощь будет высоко оценена.

Благодаря

Марсель

+0

Не существует также проблемы с тем, что он использует состояние в @Stateless EJB? – cdmckay

ответ

10

Вы получаете NullPointerException, так как вы создаете свой код BookService с помощью new() - что в принципе не так - и ничего не вводится в EJB. EJB - это компонент, который управляется контейнером и должен быть получен либо путем инъекции, либо с помощью поиска.

Здесь, в то время как спецификация JSP позволяет запускать любой код в scriplet, вызов 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 Managed Bean (и ваш EJB может быть введен в таких компонентах).

Если вам нужны образцы, взгляните на Java EE Code Samples & Apps.

Обновление: См How do I access a Local EJB component from a POJO? в EJB FAQ для получения более подробной информации о JNDI (особенно новый portable global JNDI names defined by the EJB 3.1 specification).

+0

Большое спасибо. Очень хорошее объяснение. Я получаю: javax.naming.NameNotFoundException: BookServiceBean не найден ??? –

+0

@Marcel Я не был полностью уверен в имени JNDI, в соответствии с которым bean будет доступен. Посмотрите на консоль GlassFish, там должно быть зарегистрировано имя JDNI. –

+0

Он работал следующим образом: InitialContext(). Lookup ("java: module/BookServiceBean"); Еще раз спасибо. Весы –

1

Try:

@PersistenceContext(unitName = "sample") 
private EntityManager em; 
+1

Это не поможет, пока он использует конструктор. – whiskeysierra

+0

Спасибо. Я изменил это уже, и это не похоже на проблему. –

0

Вы инстанцировании боб службы непосредственно, когда вам действительно нужно быть с контейнером вводить его (через @EJB). Однако это не поддерживается в JSP, поэтому вам также придется переключиться на сервлет.

+0

Большое спасибо. Если я использую @EJB в сервлете, я получаю ошибку компиляции: аннотация @EJB запрещена для этого местоположения.MMMMMMMMM Marcel –

+0

Не могли бы вы немного привести небольшой пример. жаль, что я новичок –

+0

Хорошо. Это должно быть вне методов теперь я получаю очень хороший Исключение: –