Я использую 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сть!