我的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>
我不知道我的配置有什么问题。有人请帮帮我。如果您需要更多信息,我愿意分享。
谢谢!
答案 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。谢谢!