В Seam в чем разница между введенным EntityManager и getEntityManager из EntityHome - PullRequest
3 голосов
/ 08 марта 2010

Я тестирую приложение Seam, используя API для тестирования игл. В моем коде я использую метод getEntityManager () из EntityHome. Когда я запускаю модульные тесты для базы данных в памяти, я получаю следующее исключение:

java.lang.IllegalStateException: No application context active
at org.jboss.seam.Component.forName(Component.java:1945)
at org.jboss.seam.Component.getInstance(Component.java:2005)
at org.jboss.seam.Component.getInstance(Component.java:1983)
at org.jboss.seam.Component.getInstance(Component.java:1977)
at org.jboss.seam.Component.getInstance(Component.java:1972)
at org.jboss.seam.framework.Controller.getComponentInstance(Controller.java:272)
at org.jboss.seam.framework.PersistenceController.getPersistenceContext(PersistenceController.java:20)
at org.jboss.seam.framework.EntityHome.getEntityManager(EntityHome.java:177)
etc ..

Я могу устранить некоторые из этих ошибок, введя EntityManager с помощью

@In
EntityManager entityManager;

К сожалению, постоянный метод EntityHome также вызывает getEntityManager. Это означает много издевательств или переписывание кода каким-либо образом. Есть ли обходной путь и почему это исключение все равно выбрасывается? Кстати, я использую Seam 2.2.0 GA.

В компонентах нет ничего особенного. Они генерируются seam-gen. Тест выполняется в базе данных памяти - я следовал за примерами в http://jbosscc -needle.sourceforge.net / jbosscc-needle / 1.0 / db-util.html .

1 Ответ

4 голосов
/ 14 марта 2010

В Seam в чем разница между введенным EntityManager и getEntityManager из EntityHome ?

Никто.

При использовании getEntityManager из EntityHome Seam будет искать управляемый Seam контекст персистентности с именем entityManager . Если вы настроите свой управляемый швом контекст персистентности с другим именем, чем entityManager , ваш EntityHome выдаст исключение.

Вот реализация по умолчанию getEntityMananger в EntityHome

public EntityManager getEntityManager() {
    return (EntityMananger) Component.getInstance("entityManager");
}

И при использовании @ In-jected EntityManager Seam будет работать так, как показано выше. Оба являются одним и тем же контекстом управляемости шва.

Помните, что Seam выполняет поиск по имени поля @ In-jected Component. Например:

@In
EntityManager entityManager;

Поскольку имя поля EntityManager entityManager , Seam будет выполнять иерархический поиск с использованием этого имени;

Здесь и здесь вы можете увидеть, как настроить контекст управляемой шовности.

С уважением,

...