Skip to content

Commit f2dc075

Browse files
committed
Defensively handle DatabaseMetaData.getConnection() returning null
Issue: SPR-16495 (cherry picked from commit 766e602)
1 parent 3b0eca9 commit f2dc075

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/OracleTableMetaDataProvider.java

+19-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -64,23 +64,26 @@ public OracleTableMetaDataProvider(DatabaseMetaData databaseMetaData, boolean in
6464

6565
super(databaseMetaData);
6666
this.includeSynonyms = includeSynonyms;
67-
68-
lookupDefaultSchema(databaseMetaData);
67+
this.defaultSchema = lookupDefaultSchema(databaseMetaData);
6968
}
7069

7170

7271
/*
7372
* Oracle-based implementation for detecting the current schema.
7473
*/
75-
private void lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
74+
private static String lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
7675
try {
7776
CallableStatement cstmt = null;
7877
try {
79-
cstmt = databaseMetaData.getConnection().prepareCall(
80-
"{? = call sys_context('USERENV', 'CURRENT_SCHEMA')}");
78+
Connection con = databaseMetaData.getConnection();
79+
if (con == null) {
80+
logger.debug("Cannot check default schema - no Connection from DatabaseMetaData");
81+
return null;
82+
}
83+
cstmt = con.prepareCall("{? = call sys_context('USERENV', 'CURRENT_SCHEMA')}");
8184
cstmt.registerOutParameter(1, Types.VARCHAR);
8285
cstmt.execute();
83-
this.defaultSchema = cstmt.getString(1);
86+
return cstmt.getString(1);
8487
}
8588
finally {
8689
if (cstmt != null) {
@@ -89,7 +92,8 @@ private void lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
8992
}
9093
}
9194
catch (SQLException ex) {
92-
logger.debug("Encountered exception during default schema lookup", ex);
95+
logger.debug("Exception encountered during default schema lookup", ex);
96+
return null;
9397
}
9498
}
9599

@@ -113,6 +117,12 @@ public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData,
113117
}
114118

115119
Connection con = databaseMetaData.getConnection();
120+
if (con == null) {
121+
logger.warn("Unable to include synonyms in table metadata lookup - no Connection from DatabaseMetaData");
122+
super.initializeWithTableColumnMetaData(databaseMetaData, catalogName, schemaName, tableName);
123+
return;
124+
}
125+
116126
NativeJdbcExtractor nativeJdbcExtractor = getNativeJdbcExtractor();
117127
if (nativeJdbcExtractor != null) {
118128
con = nativeJdbcExtractor.getNativeConnection(con);
@@ -149,7 +159,7 @@ public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData,
149159
Boolean originalValueForIncludeSynonyms;
150160

151161
try {
152-
Method getIncludeSynonyms = con.getClass().getMethod("getIncludeSynonyms", (Class[]) null);
162+
Method getIncludeSynonyms = con.getClass().getMethod("getIncludeSynonyms");
153163
ReflectionUtils.makeAccessible(getIncludeSynonyms);
154164
originalValueForIncludeSynonyms = (Boolean) getIncludeSynonyms.invoke(con);
155165

0 commit comments

Comments
 (0)