Есть 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(…);
}
…
}