1

私はJavaEEを初めて使用します。最初の例をいくつか実行してみました(JPA)。Glassfishv3を使用しています。問題は、AppServerがEntityManagerを挿入できないことです。Hearは 、JSPクライアントで拡張したhttp://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_forの一例です。

実在物:


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>

この例を実行すると、createOrUpdate()メソッドでjava.lang.NullPointerExceptionが発生するため、entityManagerが正しく挿入されていないことは明らかです。私は今何日も治療法を見つけようとしました、そしていくつかの助けが大いにありがたいです。

ありがとう

マルセル

4

3 に答える 3

10

これは、基本的に間違っている-を使用しNullPointerExceptionてインスタンス化しているために取得され、EJBには何も注入されません。EJBはコンテナによって管理されるコンポーネントであり、インジェクションまたはルックアップのいずれかを介して取得する必要があります。BookServicenew()

ここで、JSP仕様では任意のコードをスクリプトレットで実行できますが、JSPからEJBを呼び出すことは実際には推奨されておらず、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>

ただし、サーブレットまたはJSFマネージドBeanからEJBを呼び出す必要があります(EJBはそのようなコンポーネントに挿入される可能性があります)。

いくつかのサンプルが必要な場合は、JavaEEコードのサンプルとアプリをご覧ください。

更新:POJOからローカルEJBコンポーネントにアクセスするにはどうすればよいですか?を参照してください。JNDI(特に、EJB 3.1仕様で定義された新しいポータブルグローバルJNDI名)の詳細については、EJBFAQを参照してください。

于 2010-03-01T21:58:09.187 に答える
1

試す:

@PersistenceContext(unitName = "sample")
private EntityManager em;
于 2010-03-01T21:40:55.470 に答える
0

コンテナに(@EJBを介して)注入させる必要がある場合は、サービスBeanを直接インスタンス化します。ただし、これはJSPではサポートされていないため、サーブレットにも切り替える必要があります。

于 2010-03-01T21:54:48.933 に答える