У меня возникла проблема с впрыском 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");
Похоже, что библиотеки и классы в проекте противоречат тем, что загружает стеклянная рыба. Мне никогда не повезло со встроенными контейнерами и maven, потому что maven не сохраняет чистые классы. Что произойдет, если вы начнете разворачивать старую рыбу в новом vm? – LightGuard
@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