diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java index 2f4821a7a76..ebee53ab79c 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java @@ -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"); * you may not use this file except in compliance with the License. @@ -75,7 +75,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider { } catch (SQLException ex) { if (logger.isWarnEnabled()) { - logger.warn("Error retrieving 'DatabaseMetaData.supportsCatalogsInProcedureCalls' - " + ex.getMessage()); + logger.warn("Error retrieving 'DatabaseMetaData.supportsCatalogsInProcedureCalls': " + ex.getMessage()); } } try { @@ -83,7 +83,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider { } catch (SQLException ex) { if (logger.isWarnEnabled()) { - logger.warn("Error retrieving 'DatabaseMetaData.supportsSchemasInProcedureCalls' - " + ex.getMessage()); + logger.warn("Error retrieving 'DatabaseMetaData.supportsSchemasInProcedureCalls': " + ex.getMessage()); } } try { @@ -91,7 +91,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider { } catch (SQLException ex) { if (logger.isWarnEnabled()) { - logger.warn("Error retrieving 'DatabaseMetaData.storesUpperCaseIdentifiers' - " + ex.getMessage()); + logger.warn("Error retrieving 'DatabaseMetaData.storesUpperCaseIdentifiers': " + ex.getMessage()); } } try { @@ -99,7 +99,7 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider { } catch (SQLException ex) { 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 */ - private void processProcedureColumns(DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) { - ResultSet procs = null; + private void processProcedureColumns( + DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) { + String metaDataCatalogName = metaDataCatalogNameToUse(catalogName); String metaDataSchemaName = metaDataSchemaNameToUse(schemaName); String metaDataProcedureName = procedureNameToUse(procedureName); @@ -318,6 +319,8 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider { logger.debug("Retrieving metadata for " + metaDataCatalogName + "/" + metaDataSchemaName + "/" + metaDataProcedureName); } + + ResultSet procs = null; try { procs = databaseMetaData.getProcedures(metaDataCatalogName, metaDataSchemaName, metaDataProcedureName); List found = new ArrayList(); @@ -326,16 +329,24 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider { "." + procs.getString("PROCEDURE_NAME")); } procs.close(); + if (found.size() > 1) { - throw new InvalidDataAccessApiUsageException("Unable to determine the correct call signature - " + - "multiple procedures/functions/signatures for " + metaDataProcedureName + " found " + found); + throw new InvalidDataAccessApiUsageException( + "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)) { String packageName = metaDataProcedureName.substring(0, metaDataProcedureName.indexOf(".")); - throw new InvalidDataAccessApiUsageException("Unable to determine the correct call signature for " + - metaDataProcedureName + " - package name should be specified separately using " + - "'.withCatalogName(\"" + packageName + "\")'"); + throw new InvalidDataAccessApiUsageException( + "Unable to determine the correct call signature for '" + metaDataProcedureName + + "' - 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 + "'"); } }