Spring JpaRepository data signatures are already marked @Transactional, so if you use only one, you don't need to do anything special:
public interface PersonRepository extends JpaRepository<Person, Integer> { }
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = {RepositoryConfiguration.class}) public class PersonRepositoryTest { private PersonRepository personRepository; @Autowired public void setPersonRepository(PersonRepository PersonRepository) { this.personRepository = PersonRepository; } @Test public void testReactiveSavePerson() { Person person = new Person("Jane", "Doe"); assertNull(person.getId());
If you need to combine several repositories into one transaction, you can use something like the class below:
@Component() public class ObservableTxFactory { public final <T> Observable<T> create(Observable.OnSubscribe<T> f) { return new ObservableTx<>(this, f); } @Transactional public void call(Observable.OnSubscribe onSubscribe, Subscriber subscriber) { onSubscribe.call(subscriber); } private static class ObservableTx<T> extends Observable<T> { public ObservableTx(ObservableTxFactory observableTxFactory, OnSubscribe<T> f) { super(new OnSubscribeDecorator<>(observableTxFactory, f)); } } private static class OnSubscribeDecorator<T> implements Observable.OnSubscribe<T> { private final ObservableTxFactory observableTxFactory; private final Observable.OnSubscribe<T> onSubscribe; OnSubscribeDecorator(final ObservableTxFactory observableTxFactory, final Observable.OnSubscribe<T> s) { this.onSubscribe = s; this.observableTxFactory = observableTxFactory; } @Override public void call(Subscriber<? super T> subscriber) { observableTxFactory.call(onSubscribe, subscriber); } } }
You must also define a factory bean:
@Bean ObservableTxFactory observableTxFactory() { return new ObservableTxFactory(); }
Services:
@Service public class PersonService { @Autowired PersonRepository personRepository; @Autowired ObservableTxFactory observableTxFactory; public Observable<Person> createPerson(String firstName, String lastName) { return observableTxFactory.create(s -> { Person p = new Person(firstName, lastName); s.onNext(personRepository.save(p)); }); } }
Test:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = {RepositoryConfiguration.class}) public class PersonServiceTest { @Autowired PersonRepository personRepository; @Autowired ObservableTxFactory observableTxFactory; @Test public void testPersonService() { final PersonService service = new PersonService(); service.personRepository = personRepository; service.observableTxFactory = observableTxFactory; final Observable<Person> personObservable = service.createPerson("John", "Doe"); personObservable.subscribe();
Screenshot showing the proxy: 
John scattergood
source share