Я просматривал множество похожих вопросов, которые не отражали мою точную проблему. Если я упустил из виду, что кто-то уже решил эту проблему, сообщите мне.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;
}
}
Ненавижу задавать очевидный вопрос, но уверены ли вы, что контекст персистентности был успешно создан при запуске? Есть ли ошибки в журнале? – jgitter
Я так же уверен, как я могу быть без ошибок в отображаемом файле журнала. Кроме того, в нем указано, что все мои источники данных развернуты. Также я установил org.jboss.as.jpa на уровень журнала TRACE, надеясь поймать что-нибудь не так. Не может быть, что файлы -ds.xml не нравятся? –
в дополнение к кривым уровням журналов для JPA, попробуйте настроить уровни журналов для отслеживания для реализации. Я полагаю, вы используете спящий режим? – jgitter