Управление загрузочными транзакциями Spring не работает для следующей конфигурации - PullRequest
0 голосов
/ 08 июня 2018

У меня есть следующая конфигурация в моем приложении весенней загрузки.и я выбрасываю 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();


    }

1 Ответ

0 голосов
/ 08 июня 2018

Я нашел причину этого поведения.Spring boot откатывает транзакцию, если приложение выдает исключение времени выполнения.На своем сервисном уровне я перехватываю исключение времени выполнения и выбрасываю специфичное для приложения исключение, которое является причиной, по которой Spring не откатывает транзакцию.Таким образом, после изменения кода для выдачи того же самого исключения времени выполнения, которое было изначально сгенерировано, приложение успешно откатило транзакцию.

Приведенный выше код будет выполняться, если я поместу его в слой службы @Transactional (rollbackFor = Exception.class)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...