Вы, вероятно, не хотите использовать функциональность Transaction in View. Обычно то, что происходит по запросу, составляет
- запрос приходит
- вызывает некоторую операцию, которая сохраняет данные в базу данных
- ответ гаснет. то есть визуализировать страницу успеха или вернуть json или что-то еще
Причина, по которой вы не хотите видеть «транзакцию в поле зрения», заключается в том, что при возникновении ошибки на шаге 3 ваша транзакция будет откатываться, даже если фактическая бизнес-логика была успешной, только рендеринг ответа не удался.
Теперь я сделал предположение, что вы хотите, чтобы данные были зафиксированы, даже если после фиксации произошла ошибка. Если это предположение неверно, тогда все в порядке.
Поскольку методы обслуживания заключены в транзакции, возможно, более простое решение вашей проблемы - это рефакторинг кода, чтобы одна служба вызывалась на каждый входящий запрос. Обычно это называется «фасадный рисунок». Допустим, у вас есть
Service1.op1()
Service2.op2()
и вы вызываете оба этих метода для одного запроса. Вы можете просто создать другой сервис
AppFacade.doOp1andOp2()
, который вызывает op1 и op2 для соответствующих служб.
Другой возможностью было бы настроить Spring для размещения транзакций вокруг ваших действий Struts с декларативным управлением транзакциями. Обратите внимание, что с транзакциями с момента открытия tx до момента его закрытия все операции с БД будут использовать одну и ту же транзакцию, поэтому даже если вы вызываете несколько сервисов, все они используют один и тот же tx. =. Смотрите документацию здесь:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html
конкретно 10.5.2
Но я думаю, что использование одного сервисного вызова на единицу бизнес-функциональности - лучший подход.