Spring Boot @Transactional не работает с управляемой транзакцией Weblogic - PullRequest
0 голосов
/ 21 октября 2019

Я использую Spring JDBC для выполнения хранимых процедур. JNDI управляется Oracle Weblogic 12c, поэтому мне не нужно указывать хост, пользователя или пароль, а просто имя JNDI для их выполнения.

У меня есть сборка остальных API, и мне нужно добиться откатаВыполненная процедура в случае, если какой-либо поток после этого выдаст ошибку.

@Transactional из пружины должен сделать свое дело, и, поскольку я использую загрузочную пружину, подумал, что я мог бы использовать автоконфигурирование, поэтому мне не нужно определятьдополнительные классы bean или @configure

Я добавил аннотацию @Transactional к классу обслуживания, который вызывает класс dao, и к тому, у кого есть другая бизнес-логика.

Вот как явызовите мои хранимые процедуры:

@Repository
public class DbDaoImpl implements DbDao{

    private static final Logger logger = Logger.getLogger(DbDaoImpl.class);

    @Autowired
    Propiedades propiedades;

    @Override
    public InsertarOccResponseBean insertarOcc(String mensajeTransaccion, InsertarOccRequestBean request)
            throws DBException {

        DataSource dbDs;
        InsertarOccResponseBean objResponse = new InsertarOccResponseBean();

        try {
            InitialContext ctx = new InitialContext();
            dbDs = (DataSource) ctx.lookup(propiedades.bscsJNDI);

            dbDs.setLoginTimeout(Integer.parseInt(propiedades.timeOutConecMaxTimeInsertarOcc));

            SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dbDs)
                .withoutProcedureColumnMetaDataAccess()
                .withSchemaName(propiedades.bscsDBOwner)
                .withProcedureName(propiedades.spInsertarOcc)
                .declareParameters(
                        new SqlParameter("P_CODCLI", OracleTypes.VARCHAR),
                        new SqlParameter("P_CODOCC", OracleTypes.VARCHAR),
                        new SqlParameter("P_FECVIG", OracleTypes.VARCHAR),
                        new SqlParameter("P_NUMCUO", OracleTypes.VARCHAR),
                        new SqlParameter("P_MONTO", OracleTypes.FLOAT),
                        new SqlParameter("P_COMENT", OracleTypes.VARCHAR),
                        new SqlOutParameter("P_RESULT", OracleTypes.NUMBER));

            jdbcCall.getJdbcTemplate().setQueryTimeout(Integer.parseInt(propiedades.timeOutExecMaxTimeInsertarOcc));

            SqlParameterSource objParametrosIN = new MapSqlParameterSource()
                    .addValue( "P_CODCLI", request.getCodCli())
                    .addValue( "P_CODOCC", request.getCodOcc())
                    .addValue( "P_FECVIG", request.getFecVig())
                    .addValue( "P_NUMCUO", request.getNumCuo())
                    .addValue( "P_MONTO", request.getMonto())
                    .addValue( "P_COMENT", request.getComent());

            Map<String, Object> resultMap = jdbcCall.execute(objParametrosIN);

            objResponse.setCodigoRespuesta(resultMap.get("P_RESULT") != null ? resultMap.get("P_RESULT").toString() : Constantes.STRING_EMPTY);
            objResponse.setMensajeRespuesta(Constantes.FLAG_EXITO);

        } catch (Exception e) {
            logger.info( "Error" );
        }     
        return objResponse;
    }

}

В моем классе обслуживания у меня есть это:

@Component
public class AjusteReclamoServiceImpl implements AjusteReclamoService{

    private static final Logger logger = Logger.getLogger(AjusteReclamoServiceImpl.class);

    @Autowired
    Propiedades propiedades;

    @Autowired
    private DbDao dbDao;

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public EjecutarAjusteResponse ejecutarAjuste(HttpHeaders headerRequest, EjecutarAjusteRequest request,
            HttpServletResponse headerResponse) throws Exception {

        HeaderRequest objHeaderRequest = new HeaderRequest(headerRequest);

        EjecutarAjusteResponse objEjecutarAjusteResponse = new EjecutarAjusteResponse();

        try {

            InsertarOccRequestBean objInsertarOccRequestBean = new InsertarOccRequestBean(request.getListaOcc());
            InsertarOccResponseBean objInsertarOccResponseBean = new InsertarOccResponseBean();

            //HERE 
            objInsertarOccResponseBean = dbDao.insertarOcc(mensajeTransaccion, objInsertarOccRequestBean);


            //AT THIS POINT ROLLBACK SHOULD BE EXECUTED BUT RECORDS ARE STILL SAVING ON DATABASE
            throw new Exception("This is checked exception throwing intentionally");

        } catch (Exception ex) {
            logger.info(mensajeLog + "Exception general " + ex.getMessage());
        }

        return objEjecutarAjusteResponse;
    }

При возникновении этой ошибки выполненная хранимая процедура должна выполнить откат, и никакие записи не должны быть сохранены. в базе данных.

Кто-нибудь знает, нужно ли настраивать @Transactional при весенней загрузке с использованием управляемого JNDI weblogic или почему он не работает?

Спасибо в advaсть!

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