Стандартное решение для этого - вернуть значение.См., Например, ye olde java.security.AccessController.doPrivileged
.
Таким образом, код будет выглядеть примерно так:
public Long getNumber(
final String type, final String refNumber, final Long year
) throws ServiceException {
try {
Session session = PersistenceHelper.getSession();
return session.doWork(new Work<Long>() {
public Long execute(Connection conn) throws SQLException {
CallableStatement st = conn.prepareCall("{ CALL PACKAGE.procedure(?, ?, ?, ?) }");
try {
st.setString(1, type);
st.setString(2, refNumber);
st.setLong(3, year);
st.registerOutParameter(4, OracleTypes.NUMBER);
st.execute();
return st.getLong(4);
} finally {
st.close();
}
}
});
} catch (Exception e) {
throw ServiceException(e);
}
}
(Также исправлена потенциальная утечка ресурсов, и для любого возврата возвращается null
ошибка.)
Обновление: очевидно, Work
из сторонней библиотеки и не может быть изменен.Поэтому я предлагаю не использовать его, по крайней мере изолировать ваше приложение, чтобы вы не использовали его напрямую.Что-то вроде:
public interface WithConnection<T> {
T execute(Connection connnection) throws SQLException;
}
public class SessionWrapper {
private final Session session;
public SessionWrapper(Session session) {
session = nonnull(session);
}
public <T> T withConnection(final WithConnection<T> task) throws Service Exception {
nonnull(task);
return new Work() {
T result;
{
session.doWork(this);
}
public void execute(Connection connection) throws SQLException {
result = task.execute(connection);
}
}.result;
}
}