注入 WildFly 10 EJB 时 EntityManager 为空
EntityManager is null when injected in WildFly 10 EJB
我一直致力于将我们的应用程序从 JBoss AS 6 迁移到 Wildfly 10。我遇到的主要问题是 EntityManager 没有注入到 EJB 中。我已经对此进行了一段时间的研究,并尝试了我发现的一切,但没有任何帮助。
我还没有一个简单的应用程序来重现问题,但这里有一些细节和代码片段。
我们正在使用 SAR 文件进行部署。这是一个 Spring 框架应用程序。我们的二级缓存暂时关闭。这是我需要解决的另一个问题。
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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_1_0.xsd"
version="1.0">
<persistence-unit name="IpsDb" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/HarmonyServerDS</jta-data-source>
<jar-file>../harmonyserver-model.jar</jar-file>
<properties>
<!-- pessimistic lock timeout in milliseconds (Integer or String), this is a hint used by Hibernate but requires support by your underlying database. -->
<property name="javax.persistence.lock.timeout" value="15000"/>
<!-- query timeout in milliseconds (Integer or String), this is a hint used by Hibernate but requires support by your underlying database -->
<property name="javax.persistence.query.timeout" value="15000"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
</properties>
</persistence-unit>
</persistence>
独立数据源的开头-full.xml:
<datasource jta="true" jndi-name="java:jboss/datasources/HarmonyServerDS" pool-name="HarmonyServerDS" enabled="true" use-java-context="true" spy="false" use-ccm="true" connectable="false">
来自 EJB class(这些是来自 class 的重要部分,但不是全部代码):
@Stateless
@Clustered
public class DataModificationBean implements DataModificationLocal {
@PersistenceUnit(unitName="IpsDb")
private EntityManagerFactory entityMgrFactory;
@PersistenceContext(unitName="IpsDb")
private EntityManager entityMgr;
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
@InterruptOnTransactionTimeout(value=true)
public DataModificationResponse handleModification(DataModification mod, ModificationHandler handler, AdaptationContext adaptation, boolean bulk_lock)
{
try {
// Handler's data update monitor for delta changes.
DataUpdateMonitor updateMonitor = null;
// Pre-process the request and gather up the dataContext for processing.
logger.info("DataModificationBean EntityMgr=" + (entityMgr == null ? "null" : entityMgr.toString()));
logger.info("DataModificationBean EntityMgrFactory=" + (entityMgrFactory == null ? "null" : entityMgrFactory.toString()));
handler.preProcess(this, entityMgr);
...
该片段底部的日志显示 entityMgr 和 entityMgrFactory 为空。
还有什么我想念的吗?或者我可以展示的任何其他有用的内容?
我发现了问题。我不得不将 JNDI bean 名称从我猜想的旧格式更改为新格式。我已经改变了其中的一些,但没有改变这个 bean 的那个。未从上下文中找到该 bean,因此在代码中创建了一个新的 bean。我们有这段代码只用于测试用例,但我没有注意到它在做什么。现在我修复了 JNDI 名称,找到了 bean 并注入了 EntityMgr。
我一直致力于将我们的应用程序从 JBoss AS 6 迁移到 Wildfly 10。我遇到的主要问题是 EntityManager 没有注入到 EJB 中。我已经对此进行了一段时间的研究,并尝试了我发现的一切,但没有任何帮助。
我还没有一个简单的应用程序来重现问题,但这里有一些细节和代码片段。
我们正在使用 SAR 文件进行部署。这是一个 Spring 框架应用程序。我们的二级缓存暂时关闭。这是我需要解决的另一个问题。
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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_1_0.xsd"
version="1.0">
<persistence-unit name="IpsDb" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/HarmonyServerDS</jta-data-source>
<jar-file>../harmonyserver-model.jar</jar-file>
<properties>
<!-- pessimistic lock timeout in milliseconds (Integer or String), this is a hint used by Hibernate but requires support by your underlying database. -->
<property name="javax.persistence.lock.timeout" value="15000"/>
<!-- query timeout in milliseconds (Integer or String), this is a hint used by Hibernate but requires support by your underlying database -->
<property name="javax.persistence.query.timeout" value="15000"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
</properties>
</persistence-unit>
</persistence>
独立数据源的开头-full.xml:
<datasource jta="true" jndi-name="java:jboss/datasources/HarmonyServerDS" pool-name="HarmonyServerDS" enabled="true" use-java-context="true" spy="false" use-ccm="true" connectable="false">
来自 EJB class(这些是来自 class 的重要部分,但不是全部代码):
@Stateless
@Clustered
public class DataModificationBean implements DataModificationLocal {
@PersistenceUnit(unitName="IpsDb")
private EntityManagerFactory entityMgrFactory;
@PersistenceContext(unitName="IpsDb")
private EntityManager entityMgr;
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
@InterruptOnTransactionTimeout(value=true)
public DataModificationResponse handleModification(DataModification mod, ModificationHandler handler, AdaptationContext adaptation, boolean bulk_lock)
{
try {
// Handler's data update monitor for delta changes.
DataUpdateMonitor updateMonitor = null;
// Pre-process the request and gather up the dataContext for processing.
logger.info("DataModificationBean EntityMgr=" + (entityMgr == null ? "null" : entityMgr.toString()));
logger.info("DataModificationBean EntityMgrFactory=" + (entityMgrFactory == null ? "null" : entityMgrFactory.toString()));
handler.preProcess(this, entityMgr);
...
该片段底部的日志显示 entityMgr 和 entityMgrFactory 为空。
还有什么我想念的吗?或者我可以展示的任何其他有用的内容?
我发现了问题。我不得不将 JNDI bean 名称从我猜想的旧格式更改为新格式。我已经改变了其中的一些,但没有改变这个 bean 的那个。未从上下文中找到该 bean,因此在代码中创建了一个新的 bean。我们有这段代码只用于测试用例,但我没有注意到它在做什么。现在我修复了 JNDI 名称,找到了 bean 并注入了 EntityMgr。