I have a problem with my EJB annotations:
I have a 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;
}
}
And there are several DAOs that extends this DAO:
@Stateless
public class IOConfigurationDAO extends CassandraDAO<IOConfiguration> {
...
}
And here is how I use the 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());
}
But my IOConfigurationDAO is always null, so my persistenceContext annotation doesn't work at all. And there is nothing printed out in my console, so my postConstruct annotations doesn't work as well.
Here is my 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>
I don't know what is wrong in my configuration. Someone please help me. If you need more information, I am willing to share.
Thanks!
The work of the DI annotations (@Inject, @EJB, @PersistenceContext,...) made by the container. When you run a unit test, the test run out of the container. So the injectable attributes stay null. For unit tests always mock this kind of dependencies. Learn a little bit about managed beans (CDI,JSF), unit testing and Mocking.