2017-09-08 5 views
0

J'ai travaillé sur le déplacement de notre application de JBoss AS 6 vers Wildfly 10. Le problème principal auquel je suis resté est que l'EntityManager n'est pas injecté dans l'EJB. Je fais des recherches depuis un moment et j'essaie tout ce que je trouve, mais rien n'y fait.EntityManager est null lorsqu'il est injecté dans WildFly 10 EJB

Je n'ai pas une simple application pour recréer le problème pour le moment mais voici quelques détails et extraits de code.

Nous déployons en utilisant un fichier SAR. Ceci est une application de cadre Spring. Notre cache de deuxième niveau est désactivé pour le moment. C'est un autre problème que je dois aborder.

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> 

Début de la source de données à partir autonome-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"> 

de la classe EJB (Ce sont les parties importantes, mais pas tout le code de la classe):

@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); 
... 

La journalisation en bas de cet extrait montre que entityMgr et ent ityMgrFactory sont null.

Y at-il autre chose qui me manque? Ou toute autre chose que je pourrais montrer que ce serait utile?

Répondre

0

J'ai trouvé le problème. J'ai dû changer les noms de beans JNDI de ce que je suppose était un ancien format au nouveau format. J'avais changé certains d'entre eux mais pas celui de ce haricot. Le bean n'a pas été trouvé dans le contexte, donc un nouveau a été créé dans le code. Nous avons ce code là seulement pour les cas de test mais je n'ai pas remarqué que c'était ce qu'il faisait. Maintenant que j'ai corrigé le nom JNDI, le bean est trouvé et l'EntityMgr est injecté.