SimpleJdbcCall reliably throws exception on missing stored procedure

Issue: SPR-13669
This commit is contained in:
Juergen Hoeller 2015-11-12 00:47:46 +01:00
parent 43d72e2079
commit cc06183668
1 changed files with 24 additions and 13 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2014 the original author or authors. * Copyright 2002-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -75,7 +75,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
} }
catch (SQLException ex) { catch (SQLException ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("Error retrieving 'DatabaseMetaData.supportsCatalogsInProcedureCalls' - " + ex.getMessage()); logger.warn("Error retrieving 'DatabaseMetaData.supportsCatalogsInProcedureCalls': " + ex.getMessage());
} }
} }
try { try {
@ -83,7 +83,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
} }
catch (SQLException ex) { catch (SQLException ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("Error retrieving 'DatabaseMetaData.supportsSchemasInProcedureCalls' - " + ex.getMessage()); logger.warn("Error retrieving 'DatabaseMetaData.supportsSchemasInProcedureCalls': " + ex.getMessage());
} }
} }
try { try {
@ -91,7 +91,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
} }
catch (SQLException ex) { catch (SQLException ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("Error retrieving 'DatabaseMetaData.storesUpperCaseIdentifiers' - " + ex.getMessage()); logger.warn("Error retrieving 'DatabaseMetaData.storesUpperCaseIdentifiers': " + ex.getMessage());
} }
} }
try { try {
@ -99,7 +99,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
} }
catch (SQLException ex) { catch (SQLException ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("Error retrieving 'DatabaseMetaData.storesLowerCaseIdentifiers' - " + ex.getMessage()); logger.warn("Error retrieving 'DatabaseMetaData.storesLowerCaseIdentifiers': " + ex.getMessage());
} }
} }
} }
@ -309,8 +309,9 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
/** /**
* Process the procedure column metadata * Process the procedure column metadata
*/ */
private void processProcedureColumns(DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) { private void processProcedureColumns(
ResultSet procs = null; DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) {
String metaDataCatalogName = metaDataCatalogNameToUse(catalogName); String metaDataCatalogName = metaDataCatalogNameToUse(catalogName);
String metaDataSchemaName = metaDataSchemaNameToUse(schemaName); String metaDataSchemaName = metaDataSchemaNameToUse(schemaName);
String metaDataProcedureName = procedureNameToUse(procedureName); String metaDataProcedureName = procedureNameToUse(procedureName);
@ -318,6 +319,8 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
logger.debug("Retrieving metadata for " + metaDataCatalogName + "/" + logger.debug("Retrieving metadata for " + metaDataCatalogName + "/" +
metaDataSchemaName + "/" + metaDataProcedureName); metaDataSchemaName + "/" + metaDataProcedureName);
} }
ResultSet procs = null;
try { try {
procs = databaseMetaData.getProcedures(metaDataCatalogName, metaDataSchemaName, metaDataProcedureName); procs = databaseMetaData.getProcedures(metaDataCatalogName, metaDataSchemaName, metaDataProcedureName);
List<String> found = new ArrayList<String>(); List<String> found = new ArrayList<String>();
@ -326,16 +329,24 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
"." + procs.getString("PROCEDURE_NAME")); "." + procs.getString("PROCEDURE_NAME"));
} }
procs.close(); procs.close();
if (found.size() > 1) { if (found.size() > 1) {
throw new InvalidDataAccessApiUsageException("Unable to determine the correct call signature - " + throw new InvalidDataAccessApiUsageException(
"multiple procedures/functions/signatures for " + metaDataProcedureName + " found " + found); "Unable to determine the correct call signature - multiple " +
"procedures/functions/signatures for '" + metaDataProcedureName + "': found " + found);
} }
if (found.size() < 1) { else if (found.isEmpty()) {
if (metaDataProcedureName.contains(".") && !StringUtils.hasText(metaDataCatalogName)) { if (metaDataProcedureName.contains(".") && !StringUtils.hasText(metaDataCatalogName)) {
String packageName = metaDataProcedureName.substring(0, metaDataProcedureName.indexOf(".")); String packageName = metaDataProcedureName.substring(0, metaDataProcedureName.indexOf("."));
throw new InvalidDataAccessApiUsageException("Unable to determine the correct call signature for " + throw new InvalidDataAccessApiUsageException(
metaDataProcedureName + " - package name should be specified separately using " + "Unable to determine the correct call signature for '" + metaDataProcedureName +
"'.withCatalogName(\"" + packageName + "\")'"); "' - package name should be specified separately using '.withCatalogName(\"" +
packageName + "\")'");
}
else {
throw new InvalidDataAccessApiUsageException(
"Unable to determine the correct call signature - no " +
"procedure/function/signature for '" + metaDataProcedureName + "'");
} }
} }