LINQ к объектам:
у меня есть намного больше я наклеенный Delicious.com .
Удалось создать тестовый пример для этой проблемы:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:web/WEB-INF/spring/applicationContext.xml",
"file:web/WEB-INF/spring/services.xml"})
@Transactional
public class DoNotRollBackTest {
@Autowired FakeService fakeService;
@Test
@Rollback(false)
public void testRunXFireException() {
fakeService.doSomeTransactionalStuff();
}
}
FakeService:
@Service
public class FakeService {
@Autowired private EcomService ecomService;
@Autowired private WebService webService;
@Transactional(noRollbackFor={XFireRuntimeException.class})
public void doSomeTransactionalStuff() {
Order order = ecomService.findOrderById(459);
try {
webService.letsThrowAnException();
} catch (XFireRuntimeException e) {
System.err.println("Caugh XFireRuntimeException:" + e.getMessage());
}
order.setBookingType(BookingType.CAR_BOOKING);
ecomService.persist(order);
}
}
WebService:
@Transactional(readOnly = true)
public class WebService {
public void letsThrowAnException() {
throw new XFireRuntimeException("test!");
}
}
Это воссоздает исключение отката.
Затем я понял, что транзакция, вероятно, помечается как rollbackOnly в WebService.letsThrowAnException, поскольку WebService также является транзакционным. Я перешел к аннотации:
@Transactional(noRollbackFor={XFireRuntimeException.class})
public void letsThrowAnException() {
Теперь транзакция не откатывается, и я могу зафиксировать изменения в Order.
Вы не должны создавать исключение, если Spring может его увидеть. В этом случае вы не должны бросать WebServiceOrderFailed ()
. Решение состоит в том, чтобы разделить код на два метода. Первый метод выполняет обработку ошибок и возвращает исключение, внешний метод создает транзакцию.
[РЕДАКТИРОВАТЬ] Что касается noRollbackFor
: попробуйте заменить Exception.class
на WebServiceOrderFailed.class
.