Я не получил ни клевок на предложения, но, наконец, понял это, поэтому решил опубликовать ответ на тот случай, если кто-нибудь еще попытается выяснить, что делать с откатом.Я включил уровень отладки для ведения журнала commons / log4j, чтобы я мог видеть, что происходит в среде Spring со всем.Вывод обильный, но полезный.
Оказалось, что мне не хватало понимания того, где Spring Framework перехватывает и перехватывает исключения в конфигурации, чтобы инициировать откат.
MyПервый набор кода, до того как я заполнил транзакцию, я перехватывал исключения из синтаксического анализа XML и просто возвращал нулевой указатель для обработки вызывающей стороной.Я не думал о том, где Spring будет обрабатывать исключение, поэтому меня не поразило, что если я поймаю исключения и не перебрасываю их, то Spring не знает.Моей следующей попыткой было передать все исключения, но нигде не обрабатывать их, ошибочно подумав, что Spring - это волшебство.Хорошей новостью было то, что транзакция была отменена, плохая новость состояла в том, что пользователю была возвращена страница с ошибкой.
Итак, мое "а-ха!"Был момент, когда я понял, что метод, указанный в конфигурации (т. е. в службе), должен быть тем, кто выдает исключение.Да, после осознания этого это кажется очевидным, но мне потребовалось пройти через это, чтобы понять это.Таким образом, в моем примере метод «uploadModelToProject» должен был перебросить исключения после того, как он его получил, и вызывающий объект для этого метода в службе должен вместо этого обработать исключение, что произошло бы сразу после того, как Spring перехватил его и выполнил откат.
Кроме того, вместо того, чтобы моя функция более низкого уровня в моем XML Importer выдавала все эти различные типы исключений, я создал свое собственное «ImportException», перехватил исключения и выбросил ImportException вверх.
Надеюсь, это кому-нибудь поможет!