【问题标题】:JBoss 7 + JPA doesn't inject entity manager to servletJBoss 7 + JPA 不会将实体管理器注入到 servlet
【发布时间】:2014-05-06 11:43:01
【问题描述】:

我正在尝试将我的实体管理器放入一个简单的 Hello World servlet,但我遇到了问题。我确定这是由于某种错误配置,但找不到它在哪里。我有一个基本的 servlet:

public class HelloWorldServlet extends HttpServlet {

    public static final String HELLO_WORLD_WELCOME_MESSAGE = "This is the Hello World servlet!";

    @Inject
    private EntityManager entityManager;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();

        out.println(HELLO_WORLD_WELCOME_MESSAGE);

        List<Book> books = entityManager.createQuery("getBooks", LegacySermon.class).getResultList();
        for (Book book : books) {
            out.println(book.getTitle());
        }

        entityManager.close();
    }

资源配置:

public class Resources {

    @PersistenceContext
    @Produces
    private EntityManager entityManager;
}

还有一个persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="grace">
        <jta-data-source>java:jboss/datasources/PostgreSQLDS</jta-data-source>
    </persistence-unit>
</persistence>

全部配置。但是,entityManager 没有被注入,所以当我尝试调用 .createQuery 方法时,我得到了 NullPointerException。我的配置缺少什么?

【问题讨论】:

  • 尝试在 中添加属性 transaction-type="JTA"
  • 控制事务管理,而不是资源注入。
  • 是的,试过了,还是一样。
  • 我假设你至少有一个WEB-INF/beans.xml 对吧?
  • 叹息...我忘记了 beans.xml :-(。@JohnAment,把它作为答案,我会接受。谢谢!

标签: java jakarta-ee jpa jboss cdi


【解决方案1】:

这是我成功使用 CDI 在 JEE6 容器(例如 JBoss 7.x)中注入 EntityManager 的方式。

第 1 步:定义您自己的限定符。一个好的命名约定是使用持久性单元的名称。

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({
    ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE
})
public @interface TestPU {
}

第 2 步:给你的制片人打这个限定词。

public class TestPUProducer {

    @SuppressWarnings("unused")
    @Produces
    @PersistenceContext(unitName = "TestPU")
    @TestPU
    private EntityManager entityManager;
}

第 3 步:注入

@Inject
@TestPU
private EntityManager entityManager;

免责声明:我从未注入过 servlet,但我看不出它为什么不能在那里工作。

【讨论】:

  • 虽然这最终没有回答我的问题,但我真的很喜欢这个限定词的使用!
  • 忘记 beans.xml。哦!我什至没有考虑过这种可能性。无论如何,干得好。
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 2015-09-29
  • 2020-04-22
  • 2011-06-11
  • 1970-01-01
  • 2013-10-13
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多