У меня есть следующая конфигурация в моем приложении весенней загрузки.и я выбрасываю RuntimeException из уровня Repository и Service, чтобы увидеть обработку транзакций.Когда я выбрасываю исключение RuntimeException из уровня хранилища, транзакция откатывается, однако, если я выбрасываю исключение Runtime из слоя Service, как показано ниже, транзакция не откатывается и данные сохраняются в базе данных.Может ли кто-нибудь помочь мне, что не так со следующей конфигурацией?
@Configuration
@SpringBootApplication
@EnableAsync
@EnableScheduling
@ComponentScan(basePackages = { "com.abc.xyz.api.config", Constant.BASE_PACKAGE, com.abc.c4s.util.Constant.BASE_PACKAGE })
@EnableAutoConfiguration(exclude = { JndiConnectionFactoryAutoConfiguration.class, DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class })
@PropertySources({
@PropertySource(value = "classpath:jdbc.properties")
})
@EnableTransactionManagement
public class ProjectManagerApplication {
public static ConfigurableApplicationContext context;
private static final Logger logger = LoggerFactory.getLogger(ProjectManagerApplication.class);
public static ConfigurableApplicationContext startServer() throws Exception {
logger.debug("Starting server");
SpringApplicationBuilder builder = new SpringApplicationBuilder(ProjectManagerApplication.class);
builder.headless(false);
context = builder.run(new String[] {});
logger.debug("Server started - " + (context != null ? context.isRunning() : "context null, starting failed"));
return context;
}
}
И, следующее - это конфигурация класса моего контроллера
@RestController
public class RWSettingsController {
@Autowired
SettingsService rwSettingsService;
@RequestMapping(value = "/api/settings", method = RequestMethod.POST)
public void createKiosk(@RequestBody SettingsDTO settingDTO) throws ABCInternalException, ABCException {
//try{
settingsService.create(settingDTO);
//}catch (Exception e){
// e.printStackTrace();
// }
}
}
Это мой класс обслуживания.
@Service
@Transactional//(propagation = Propagation.SUPPORTS, readOnly = true)
public class SettingsService {
@Autowired
SettingsRepository settingsRepository;
@Autowired
ModelMapper modelMapper;
private static final Logger logger = LoggerFactory.getLogger(SettingsService.class);
// @Transactional(
// propagation = Propagation.REQUIRED,
// readOnly = false)
public void create(SettingsDTO settingsDTO) throws ButterflyInternalException, ButterflyException {
try{
SettingsModel settingsModel = new SettingsModel ();
settingsModel .setActive(true);
settingsModel .setParameterDescription(settingsDTO.getParameterDescription());
settingsModel .setParameterName(settingsDTO.getParameterName());
settingsModel .setParameterValue(settingsDTO.getParameterValue());
//throw new HibernateException("");
rwsSettingsRepository.create(rwsKioskSettingsBPA);
throw new RuntimeException("");
}catch(ABCException e){
logger.error(e.getMessage(),e);
throw e;
}catch(Exception e){
logger.error(e);
throw e;
}
}
}
И мой класс хранилища выглядит следующим образом
@Repository
//@Transactional//(propagation = Propagation.SUPPORTS, readOnly = true)
public class SettingsRepository {
@Autowired
@Qualifier("sessionFactory")
SessionFactory abcSessionFactory;
@Autowired
ABCUtilityRepository abcUtilityRepository;
private static final Logger logger = LoggerFactory.getLogger(SettingsRepository .class);
// @Transactional(
// propagation = Propagation.REQUIRED,
// readOnly = false)
public void create(RWSKioskSettingsBPA rwsKioskSettings) throws ABCException, ABCInternalException {
abcUtilityRepository.saveEntity(rwsKioskSettings);
//throw new RuntimeException();
}