Рассмотрим следующий сценарий:
Аннотированный класс без сохранения ClassOne
@Stateless
public class ClassOne {
// some injected fields
// ....
@Inject
private ClassTwo classTwo;
// ....
public void methodInClassOne() {
try {
classTwo.methodInClassTwo();
} catch(Exception e) {
// handle exception
}
}
}
Классифицированный аннотированный класс ClassTwo
@Stateless
public class ClassTwo {
// some injected fields
// ....
@Inject
private ClassThree classThree;
// ....
public void methodInClassTwo {
try{
classThree.methodInClassThree();
} catch (Exception e) {
// handle exception
}
}
}
Неаннотированный класс ClassThree
public class ClassThree {
// some injected fields
// ....
public void methodInClassThree {
// some business logic
// ....
if (conditionCheck) {
throw new RuntimeException("error message");
}
}
}
Скажем, для этого случая вышеприведенный conditionCheck всегда оценивается как true . Это рабочий код на сегодня. RuntimeException помещается в EjbException и перехватывается, обрабатывается и перебрасывается, как ожидается, до тех пор, пока не достигнет блока catch ClassOne. Но в тот момент, когда я делаю ClassThree Stateless (с @Stateless), исключение RuntimeException становится EjbTransactionRolledBackException, в результате чего транзакция отбрасывается, и любая обработка в ClassOne, которая пытается вызвать постоянную службу, прерывается из-за этого.
Я попытался поэкспериментировать с @TransactionAttributes:
ТРЕБУЕТСЯ ПОДДЕРЖКА -> дает то же поведение RollBack, убивающее транзакцию
NOT_SUPPORTED -> дает, даже до проверки состояния, при вызове JpaRepository исключение TransactionRequiredException (с которым я предположил, что должен быть также TransactionType с исходным неаннотированным классом. И, вероятно, не той же транзакцией как в ClassTwo - из-за пункта 1.)
REQUIRES_NEW -> который, казалось, вел себя так же, как исходный код.
У меня сложилось впечатление, что если бы ничего не было указано явно, то вызываемый метод / класс использовал бы тип по умолчанию REQUIRED (что, очевидно, не имело место, поскольку, как упоминалось в пункте 1.). Так как же TransactionType работает между компонентами Annotated (EJB) -NonAnnotated (CDI)? Отличается ли он от того, как он работает между двумя компонентами Annotated (EJB)? Я не уверен, что мой вопрос ясен. Короче говоря, все поведение транзакции сбивает с толку, особенно из-за того, как оно ведет себя по-разному для ClassThree до и после того, как делает его не имеющим состояния.
Любые материалы или ссылки на дополнительную информацию по этому вопросу будут действительно полезны. Заранее спасибо