@AroundInvoke в проекте CDI - PullRequest
1 голос
/ 14 июля 2011

Есть 3 проекта, которые используют CDI. Проект A имеет Перехватчик для управления транзакциями.

Проект B использует проект A для сохранения данных в базе данных. Когда я запускаю эти модульные тесты, все проходит.

Проект C использует проект B для интеграционных тестов. Эти тесты не выполняются, когда он находит аннотацию @AroundInvoke от Interceptor.

Что не так? Перехватчик есть только в Project B beans.xml.

Трассировка стека исключений не очищает мой разум. Это только показывает ошибку jassist. При отладке я обнаружил, что проблема связана с boostrap.deploybeans () внутри Weld. Итак, я прокомментировал @AroundInvoke в классе перехватчика, и все отлично с тестами, но вставка в базу данных. Я думаю, что это происходит, потому что я удалил перехватчик, который создает транзакцию для вставок.

код:

1) Существует проект А, который определяет аннотацию и перехватчик для этой аннотации. Пример:

/ аннотаций /

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Transactional {
}

/ перехватчик /

@Interceptor
@Transactional
public class TransactionalInterceptor implements Serializable {
    …
    @AroundInvoke
    public Object intercept(InvocationContext context) throws Exception {
        …
    }
    …
}

Я думаю, что этот проект должен иметь пустой /META-INF/beans.xml.

2) Есть еще один проект B, который использует перехватчик из проекта A. Пример:

public class ProjectBClass {
    …
    @Transactional
    public void interceptorMethod() {
        …
    }
    …
}

Так что я думаю, что этот проект должен иметь /META-INF/beans.xml, который включает перехватчик. Пример: * * тысяча двадцать-шесть

<beans>
<interceptors>
<class>br.com.company.projecta.TransactionalInterceptor</class>
</interceptors>
</beans>

3) Наконец, есть проект C, который использует метод из проекта B. Пример:

public class ProjectCClass {
    …
    private ProjectBClass projectBClass;
    …
    public void testerMethod() {
        …
        this.projectBClass.interceptorMethod();
        …
    }
    …
}

Я не уверен, должен ли он иметь /META-INF/beans.xml.

4) В этом же проекте есть интеграционный тест, который тестирует метод. Пример: * * тысяча тридцать четыре

public class ProjectCClassTest {
   …
   @Test
   public void test() {
      ProjectCClass projectCClass = new ProjectCClass();
      projectCClass.testerMethod();
      …
      Assert.assertEquals(…);
   }
   …
}    

1 Ответ

0 голосов
/ 16 июля 2011

Вам нужно META-INF/beans.xml во всех проектах (упакованных как .jar)

Вы не должны создавать экземпляры классов самостоятельно.Если вы делаете, они не управляются CDI.Пусть CDI их инстанцирует.Например смотрите здесь .

...