2015-05-06 1 views
0

Я просматривал множество похожих вопросов, которые не отражали мою точную проблему. Если я упустил из виду, что кто-то уже решил эту проблему, сообщите мне.EntityManager не инъецируется в сеанс без учета состояния

В настоящее время я переношу приложение EJB 2.1 на JBoss 3.x в EJB 3.x на JBoss 7.x. Из-за изменений в связи между клиентом приложения и сервером я создал небольшой тестовый клиент для проверки ошибок.

Один из них заключается в том, что entitymanager в моих сессионных компонентах без состояния не вводится, оставив EntityManager NULL. Я попытался обойти это, используя EntityManagerFactory, но ни один не вводится. Доступный источник данных доступен, и соединение было протестировано в отношении базы данных.

Я надеюсь, что некоторые из вас столкнулись с этой проблемой, могут подумать, где я могу смотреть дальше или что я могу сделать, чтобы отследить эту проблему. Прилагаются файлы persistence.xml, RemoteInterface и Bean со стороны сервера, а также код моего тестового клиента.

Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию. (Классы в основном сохранили свое имя от приложения EJB 2 на случай, если вам интересно).

Stateless Session Bean (GUITabUsersDao):

@Stateless 
@Remote(GUITabUsersDaoRemote.class) 
public class GUITabUsersDao implements GUITabUsersDaoRemote { 
    Logger logger = Logger.getLogger(GUITabUsersDao.class.getName()); 

    @PersistenceContext(name = "OracleGUIDS", type = PersistenceContextType.TRANSACTION) 
    EntityManager entityManager; 

    @Override 
    public List<GUITabUsers> findAll() throws FinderException { 
     List<GUITabUsers> resultList = null; 
     TypedQuery<GUITabUsers> namedQuery; 
     if (entityManager == null) { 
      logger.severe("**** CKU: This is not going to end well. entitymanager is null. :(****"); 
     } else { 
      namedQuery = entityManager.createNamedQuery(GUITabUsers.FIND_ALL, GUITabUsers.class); 
      resultList = namedQuery.getResultList(); 
     } 
     return resultList; 
    } 
} 

Удаленный интерфейс

public interface GUITabUsersDaoRemote { 
    List<GUITabUsers> findAll() throws FinderException; 
} 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 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"> 
    <persistence-unit name="OracleGUIDS" transaction-type="JTA"> 
     <jta-data-source>java:jboss/datasources/OracleGUIDS</jta-data-source> 
     <class>de.printcom.loginmodule.GUITabUsers</class> 
     <properties> 
      <!-- Properties for Hibernate --> 
      <property name="hibernate.hbm2ddl.auto" value="verify"/> 
      <property name="hibernate.show_sql" value="false"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

Клиент код

package de.my.test; 

public class TestClient { 
    public static final String URL = "localhost"; 
    public static final String PORT = "4447"; 

    private static final Logger LOGGER = Logger.getLogger(TestClient.class.getName()); 

    public static void main(String[] args) { 
     IDPLookupRemote bean; 
     LAEC_MachineControlSES bean2; 
     GUITabUsersDaoRemote guiTabUsersDao; 
     try { 
      EJBHomeFactory factory = EJBHomeFactory.getInstance(URL, PORT); 
      guiTabUsersDao = (GUITabUsersDaoRemote) lookup("GUITabUsersDao", GUITabUsersDaoRemote.class); 
      LOGGER.info("Bean '" + guiTabUsersDao.toString() + "' received."); 
      List<GUITabUsers> col = null; 
      try { 
       col = guiTabUsersDao.findAll(); 
      } catch (FinderException | NullPointerException e) { 
       e.printStackTrace(); 
      } 
      if (null != col) { 
       LOGGER.info(col.get(0).toString()); 
      } else { 
       LOGGER.info("Col is empty!"); 
      } 
     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static Object lookup(String jndiName, Class<?> remoteInterfaceClass) throws NamingException { 
     Object object = new Object(); 
     try { 
      Properties properties = new Properties(); 
      properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
      properties.put("jboss.naming.client.ejb.context", true); 
      properties.put(Context.PROVIDER_URL, "remote://" + URL + ":" + PORT); 
      Context context = new InitialContext(properties); 
      final String appName = "appName"; 
      final String moduleName = "moduleName"; 
      final String distinctName = ""; 
      final String beanName = jndiName; 
      final String viewClassName = remoteInterfaceClass.getName(); 
      LOGGER.info("Looking EJB via JNDI "); 
      String jndiLookupName = appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName; 
      LOGGER.info(jndiLookupName); 
      object = context.lookup(jndiLookupName); 
      LOGGER.info("Calling 'context.lookup(" + jndiLookupName + ")'"); 
      // object = context.lookup(jndiName); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
     return object; 
    } 
} 
+0

Ненавижу задавать очевидный вопрос, но уверены ли вы, что контекст персистентности был успешно создан при запуске? Есть ли ошибки в журнале? – jgitter

+0

Я так же уверен, как я могу быть без ошибок в отображаемом файле журнала. Кроме того, в нем указано, что все мои источники данных развернуты. Также я установил org.jboss.as.jpa на уровень журнала TRACE, надеясь поймать что-нибудь не так. Не может быть, что файлы -ds.xml не нравятся? –

+0

в дополнение к кривым уровням журналов для JPA, попробуйте настроить уровни журналов для отслеживания для реализации. Я полагаю, вы используете спящий режим? – jgitter

ответ

2

Как было предложено BalusC и jgitter, вот моя предыдущая редактировать в ответ:

Если вы столкнетесь с подобной проблемой не стесняйтесь купаются в моей глупости для задачи указанной ниже.

В приложении мне нужно было перейти с JBoss 3.x на 7.x, и несколько проектов были сведены вместе. Одним из таких проектов было два сохраняемость единиц, заявленных в persistence.xml а Фасоль сессионные все были объявлены примерно так:

@Stateless 
@Remote(SomeStatelessRemote.class) 
public class SomeStatelessBean implements SomeStatelessRemote { 

    @PersistenceContext(name = "OracleGUIDS") 
    EntityManager entitymanager; 
    ... 
} 

Теперь при развертывании это, вы получите сообщение об ошибке

JBAS011470: Persistence unitName was not specified 

в некоторых форумах кто-то предложил, чтобы отключить определенную подсистему в автономном

<subsystem xmlns="urn:jboss:domain:jpa:1.1"> 
    <jpa default-datasource="" default-extended-persistence-inheritance="DEEP"/> 
</subsystem> 

, как вы можете видеть, это будет отключить любую возможность использования JPA в все.

Теперь я позволил подсистемы и использовать правильный синтаксис для впрыскивать EntityManager:

@Stateless 
@Remote(SomeStatelessRemote.class) 
public class SomeStatelessBean implements SomeStatelessRemote { 

    @PersistenceContext(unitName= "OracleGUIDS") 
    EntityManager entitymanager; 
    ... 
} 

и, о чудо, я могу получить доступ к EntityManager и иметь на него. Спасибо всем, кто работает со своими мозгами, чтобы помочь мне. Надеюсь, эта запись поможет вам ИЗБЕЖАТЬ этой ошибки.