【问题标题】:Glassfish JPA: Problems injecting EntityManagerGlassfish JPA:注入 EntityManager 的问题
【发布时间】:2011-01-22 11:33:37
【问题描述】:

我是 Java EE 的新手。我试图让一些第一个示例运行(JPA)。 我正在使用 Glassfish v3。问题是我没有让 App Server 注入 实体管理器。听说是一个例子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;
    }
}

图书服务接口:


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 是 显然没有正确注入。几天来我一直试图找到一种补救措施 一些帮助将不胜感激。

谢谢

马塞尔

【问题讨论】:

  • 他在@Stateless EJB 中使用状态不是也有问题吗?

标签: java jpa jakarta-ee glassfish entitymanager


【解决方案1】:

试试:

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

【讨论】:

  • 只要他在使用构造函数,那就无济于事了。
  • 谢谢。我已经更改了,这似乎不是问题
【解决方案2】:

当您确实需要让容器注入它时(通过@EJB),您正在直接实例化服务 bean。但是,JSP 不支持此功能,因此您也必须切换到 servlet。

【讨论】:

  • 非常感谢。如果我在 servlet 中使用 @EJB,则会收到编译错误:此位置不允许使用注释 @EJB。 MMMMMMMMM 马塞尔
  • 你能不能发一个小例子。对不起,我是新手
  • 好的。它必须在方法之外,现在我得到了一个非常好的异常:
  • 异常:javax.naming.NamingException:在 SerialContext 中查找 'java:comp/env/controllers.BookController/bs' 失败 [根异常是 javax.naming.NamingException:异常解析 Ejb 为 'Remote ejb-ref name=controllers.BookController/bs,Remote 3.x interface =beans.BookServiceBean,ejb-link=null,lookup=null,mappedName=,jndi-name=beans.BookServiceBean,refType=Session' .
  • 用于查找的实际(可能是内部的)远程 JNDI 名称是 'beans.BookServiceBean#beans.BookServiceBean' [根异常是 javax.naming.NamingException:查找 'beans.BookServiceBean#beans.BookServiceBean 失败' 在 SerialContext [根异常是 javax.naming.NameNotFoundException: beans.BookServiceBean#beans.BookServiceBean not found]]]
【解决方案3】:

你得到一个NullPointerException,因为你正在用new() 实例化你的BookService——这基本上是错误的——并且没有任何东西被注入到 EJB 中。 EJB 是由容器管理的组件,应该通过注入或查找来获得。

这里,虽然 JSP 规范允许任何代码在 scriplet 中运行,但实际上并不鼓励从 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>

但是您应该从 Servlet 或 JSF Managed Bean 调用您的 EJB(并且您的 EJB 可以注入到此类组件中)。

如果您需要一些样品,请查看Java EE Code Samples & Apps

更新:有关 JNDI 的更多详细信息(尤其是新的 portable global JNDI names defined by the EJB 3.1 specification),请参阅 EJB 常见问题解答中的 How do I access a Local EJB component from a POJO?

【讨论】:

  • 非常感谢。很好的解释。我得到: javax.naming.NameNotFoundException: BookServiceBean not found ???
  • @Marcel 我不完全确定 bean 可用的 JNDI 名称。查看 GlassFish 控制台,JDNI 名称应该在那里登录。
  • 它是这样工作的:InitialContext().lookup("java:module/BookServiceBean");再次感谢你。问候
  • Pascal,也谢谢你,我遇到了同样的问题。我没有意识到我不能创建一个新的 bean,我很感激。我使用 netbeans 代码生成来访问我的,我仍然没有跟上命名约定的速度,我可以在没有一点帮助的情况下获得正确的查找名称。
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2016-06-07
  • 2016-01-30
  • 2015-05-02
  • 1970-01-01
  • 2015-08-11
  • 2013-07-25
相关资源
最近更新 更多