JPA EntityManager未在struts2和JBOSS 7.1中初始化

时间:2014-11-24 05:10:32

标签: java jpa struts2 jboss7.x cdi

我正在使用Jboss提供的JPA库启动基于struts2的应用程序。 我在standalone.xml中配置了数据源,我可以从jboss管理控制台看到 数据源已创建。并读取和处理presistence.xml文件。 但是如果我在Action Class中检查EntityManager实例。它总是说空。

这是我的persistence.xml和Action类代码段

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    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">

    <persistence-unit name="primary">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/mysqlDS</jta-data-source>

        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <!-- Properties for Hibernate -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.use_sql_comments" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        </properties>

    </persistence-unit>

</persistence>

Struts2 Action Class:

public class RegistrationAction extends  ActionSupport implements SessionAware,Preparable ,ModelDriven{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

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

    @Override
    public Object getModel() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void prepare() throws Exception {
        if(em==null)
            System.out.println(" EM is null still..");
         //even Persistence.createEntityManagerFactory("primary"); returning NULL

    }

    @Override
    public void setSession(Map<String, Object> arg0) {
        // TODO Auto-generated method stub

    }

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

}

2 个答案:

答案 0 :(得分:2)

操作由 Struts容器管理。

EntityManager由 CDI容器管理。您可以在CDI托管对象(EJB容器中的EJB,CDI托管bean,servlet,ecc ...)中注入它,但不能在Actions中注入它。

您需要使用Struts2-CDI-Plugin或执行查找才能获得它。您甚至不应该在Actions BTW中注入它,最好使用业务组件(例如EJB)并对其执行查找。

如果不使用CDI插件(例如因为使用Spring插件),Rob Veldpaus的CDIUtil.java就是完美的。

示例EJB:

@Stateless
public class MyEjb{

    @PersistenceContext(unitName="primary")
    EntityManager em;

    public Foo find(long id){
        return em.find(Foo.class, id);
    }
}

示例动作:

public class RegistrationAction extends ActionSupport 
                             implements SessionAware,Preparable ,ModelDriven {

    public String execute(){
        MyEjb ejb = new CdiUtil().lookup(MyEjb.class);
        System.out.println(ejb.find(1L));
        return SUCCESS;
    }

    /* your other stuff here */
}

答案 1 :(得分:2)

CDI Plugin struts 2插件为我工作。

包含的pom.xml:

    <!-- Import the CDI API -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-cdi-plugin</artifactId>
        <version>${struts2.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.0-SP1</version><!--$NO-MVN-MAN-VER$-->
        <scope>provided</scope>
    </dependency>

然后在我的Action类中:

public class SampleAction extends BaseAction{

private static final long serialVersionUID = 1L;

@PersistenceUnit
private EntityManagerFactory emf;

@Action(value="add")
public String add(){
    try{
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        ........
        em.merge(...);
        em.getTransaction().commit();
    }catch(Exception e){
        e.printStackTrace();
    }
    return SUCCESS;
}
}