EJB注释不起作用

时间:2017-03-27 16:57:35

标签: hibernate cassandra ejb wildfly

我的EJB注释有问题:

我有一个DAO:

@Singleton
@Startup
public class CassandraDAO<T extends Serializable> extends AbstractDAO {

  @PersistenceContext(unitName = "JPAService", type = PersistenceContextType.EXTENDED)
  private EntityManager em;

  @PostConstruct
  public void init() {
    System.out.println("***************** init CassandraDAO ***************************");
  }

  @PreDestroy
  public void destroy() {
    System.out.println("***************** destroying CassandraDAO *************************");
    if (em.isOpen()) {
      em.close();
    }
  }

  @Override
  public EntityManager getManager() {
    return em;
  }

  @Override
  public void setManager(EntityManager em) {
    this.em = em;
  }
}

有几个DAO扩展了这个DAO:

@Stateless
public class IOConfigurationDAO extends CassandraDAO<IOConfiguration> {
...
}

以下是我如何使用DAO:

public class AddAlertTest extends TestCase {
  @EJB
  private IOConfigurationDAO ioConfigurationDAO;
  public void test() {
      ioConfigurationDAO.getManager().getTransaction().begin();
      IOConfiguration ioConfig = new IOConfiguration("CH1");
      ioConfigurationDAO.getManager().persist(ioConfig);
      ioConfigurationDAO.getManager().getTransaction().commit();
      int oldSize = ioConfig.getAlerts() == null ? 0 : ioConfig.getAlerts().size();
      System.out.println("Created IO configuration with id " + ioConfig.getIoConfigurationId());

      ioConfigurationDAO.getManager().getTransaction().begin();
      Alert alert = ioConfigurationDAO.addAlert(ioConfig,
          Operators[(int) (Math.random() * Operators.length)], new Double(Math.random() * 100));
      ioConfigurationDAO.getManager().getTransaction().commit();
      int newSize = ioConfig.getAlerts().size();
      System.out.println("Created new Alert with id " + alert.getAlertId());
      System.out.println("Alert list: " + ioConfig.getAlerts());
      System.out.println("Alert is connected to " + alert.getIoConfiguration());

      assertEquals(oldSize + 1, newSize);
      assertNotNull(ioConfigurationDAO.getManager().find(Alert.class, alert.getAlertId()));

      ioConfigurationDAO.getManager().getTransaction().begin();
      ioConfigurationDAO.getManager().remove(ioConfig);
      ioConfigurationDAO.getManager().getTransaction().commit();
      System.out.println("Deleted IO configuration with id " + ioConfig.getIoConfigurationId());
  }

但我的IOConfigurationDAO始终为null,因此我的persistenceContext注释根本不起作用。并且我的控制台中没有打印出任何内容,因此我的postConstruct注释也不起作用。

这是我的persistence.xml:

<?xml version="1.0"?>
<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="JPAService">            
        <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>    
        <class>com.sensorhound.aigateway.domain.Alert</class>
        <class>com.sensorhound.aigateway.domain.DataSeriesMeta</class>
        <class>com.sensorhound.aigateway.domain.IOConfiguration</class>
        <class>com.sensorhound.aigateway.domain.NodeData</class>
        <properties>
            <property name="hibernate.transaction.jta.platform" value="JBossAS" />
            <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.0" />
            <property name="hibernate.ogm.datastore.provider" value="cassandra_experimental"/>
            <property name="hibernate.ogm.datastore.host" value="127.0.0.1:9042"/>
            <property name="hibernate.ogm.datastore.database" value="dev"/>
            <property name="hibernate.hbm2ddl.auto" value="none"></property>
            <property name = "hibernate.show_sql" value = "true" />
            <property name = "hibernate.format_sql" value = "true" />
        </properties>
    </persistence-unit>
</persistence>

我不知道我的配置有什么问题。有人请帮帮我。如果您需要更多信息,我愿意分享。

谢谢!

3 个答案:

答案 0 :(得分:0)

当EJB A扩展另一个EJB B时,通过注入使用B的客户端不会自动继承上层A的所有方法。通过ad hoc创建的代理实现对EJB的访问。

换句话说,如果注入IOConfigurationDAO您正在使用该类的代理,则客户端将看不到扩展类的所有其他业务方法。不会调用生命周期@PostConstruct等..

另外,这个设计看起来很奇怪,一个继承自@Singleton的@Stateless。

答案 1 :(得分:0)

容器制作的DI注释(@ Inject,@ EJB,@ PersistenceContext,...)的工作。运行单元测试时,测试用完了容器。因此,injectable属性保持为null。对于单元测试,总是模仿这种依赖。学习一下托管bean(CDI,JSF),单元测试和模拟。

答案 2 :(得分:0)

我无法让单元测试中的EJB工作。但我让我的EJB在项目中工作。我只是切换到有状态EJB,因为我的DAO正在数据库中进行一些修改,并将我在DAO的父类中的方法复制到DAO。谢谢!