Реализация EMF работает при вызове из EJB, но не при вызове EJB из WAR - PullRequest
0 голосов
/ 17 ноября 2011

Эта проблема несколько сложна, и я немного над головой. Я постараюсь описать это как можно более кратко.

У меня есть приложение J2EE, которое работает на Glassfish v2 и использует сообщения CCD, используя реализацию EMF ( MDHT ). Когда это вызывается из веб-сервиса, который вызывает EJB, он работает отлично и работает более года. Недавно у нас была причина вызвать это из WAR, тестовым примером является пользователь, загружающий тот же файл, который обычно отправляется через веб-сервис. Когда мы вызываем это из WAR, это не работает, EMF EPackage.Registry пуст!

Когда мы вызываем это из WAR, WAR получает экземпляр сессионного компонента EJB и просто вызывает EJB. Мы хотим сохранить как можно больше логики в EJB, чтобы не дублировать код.

Основываясь на обсуждении в списке пользователей MDHT Я уверен, что это больше проблема EMF, чем проблема MDHT, и она касается того, какой загрузчик классов используется.

Библиотеки MDHT и EMF упакованы в EJB JAR и видны загрузчику классов EJB.

Я пробовал несколько обходных путей и указывает, чтобы сузить эту проблему:

  • переместил JAR-файлы, чтобы убедиться, что загрузчик классов не может видеть библиотеки MDHT
  • Проверено в отладчике, чтобы видеть, какие загрузчики классов находятся в игре при заполнении Реестра
  • Вкопался в ЭДС и наблюдал за ClassNotFoundExceptions
  • Установите точку останова ведения журнала, чтобы увидеть, какой загрузчик классов используется при заполнении Реестра. Похоже, что загрузчик классов EJB использует, как и ожидалось.

Существуют ли известные или общие случаи использования, когда реализация EMF будет вести себя иначе, когда вызывается из WAR вместо EJB?

Это действительно проблема EMF или это более общая проблема, когда WAR вызывает EJB?

Какие другие шаги отладки я должен попытаться изолировать и определить причину этой проблемы?

1 Ответ

0 голосов
/ 22 ноября 2011

Решение этой проблемы было найдено на форумах EMF: http://www.eclipse.org/forums/index.php/m/758092/#msg_758092

Если я установил системное свойство org.eclipse.emf.ecore.EPackage.Registry.INSTANCE на org.eclipse.emf.ecore.impl.EPackageRegistryImpl, произойдет волшебство, и оно заработает.

Мне любопытно, почему это работает, но это другой вопрос.

...