2012-03-27 1 views
1

У меня возникла проблема с впрыском EntityManager из источника Producer в тестовый источник в службу в основном источнике. Цель состоит в том, чтобы внедрить эту библиотеку в другой проект, где проект будет определять Producer, используя собственное имя PersistenceContext unitName. Если у меня нет продюсера в основных источниках, я получаю ошибку Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU.Проблема с классом класса CDI с использованием maven и встроенной стеклянной рыбы

Например:

/** src/main/java/org/sample/service */ 
@Stateless 
public class MyBean { 
    @Inject 
    @MyCustomQualifier 
    private EntityManager em; 
} 


/** src/test/java/org/sample/service */ 
public class EntityManagerProducer { 
    @Produces 
    @MyCustomQualifier 
    @PersistenceContext(unitName = "MY_PU") 
    private EntityManager em; 
} 

Для того, чтобы я протестировать службу, я должен использовать Maven муравей плагин для перемещения * .class файл в target/classes каталог и удалить его до стадии упаковки. Это работает, но это kludgy. Я попытался изменить параметры <useSystemClassLoader> и <useManifestOnlyJar> в плагине surefire без успеха.

Есть ли другой способ?

Моя среда

  • Maven: 2.2.1
  • Surefire: 2.4.2
  • GlassFish-погруженного все: 3.1.1

EDIT

beans.xml существует в обоих (test/main)/resources/META-INF

Я запускаю контейнер GF следующим образом.

Map<String, Object> properties = new HashMap<String, Object>(); 
properties.put(EJBContainer.MODULES, new File[]{new File("target/classes"), new File("target/test-classes")}); 
EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties); 
Context ctx = ejbContainer.getContext(); 
MyBean service = ctx.lookup("java:global/ejb-app/classes/MyBean"); 
+0

Похоже, что библиотеки и классы в проекте противоречат тем, что загружает стеклянная рыба. Мне никогда не повезло со встроенными контейнерами и maven, потому что maven не сохраняет чистые классы. Что произойдет, если вы начнете разворачивать старую рыбу в новом vm? – LightGuard

+0

@LightGuard: По умолчанию makefire forkMode является 'once'. Таким образом, встроенный контейнер должен находиться в отдельной JVM от maven. [ссылка] (http://stackoverflow.com/questions/6813373/how-to-tell-maven2-to-execute-junit-tests-one-by-one-each-in-new-jvm-instance) – Hoon

ответ

0

Ну, я не вижу проблемы вообще ^^

У вас есть SRC/тест/ресурсы/META-INF/beans.xml?

И как выглядит ваш тест? Arquillian, или вы запускаете контейнер вручную? У вас есть persistence.xml с MY_PU PersistenceUnit в пути к классам? Любой github или так, где я могу посмотреть пример проекта?

мне нужно немного больше информации о вашей среде, чтобы помочь вам ...

+0

I «Не использовал Аркиллиан. Простой 'EJBContainer.createEJBContainer()' (примечание редактирования выше). Да, persistence.xml существует в пути к классам. Извините, нет github. – Hoon

+0

Трой, пожалуйста, попробуйте Persistence.createEntityManagerFactory («MY_PU»). CreateEntityManager()? Если это сработает, мы можем попробовать дальнейшие шаги. Если это уже дает вам недействительный EM или вообще ничего, то что-то не так с вашей установкой JPA или с вашим persistence.xml. – struberg

0

У нас была аналогичная проблема, и понижен до Maven 3.0.5.

Оказывается, проблема обсуждается в this Glassfish JIRA. Я не мог найти Maven JIRA, о котором говорится в обсуждении. Я все еще ищу способ использовать последний Maven со встроенной Glassfish, но не имел большой удачи.

Смежные вопросы