Skip to content

Commit 766e602

Browse files
committed
Defensively handle DatabaseMetaData.getConnection() returning null
Issue: SPR-16495
1 parent 7826567 commit 766e602

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

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

Lines changed: 21 additions & 10 deletions
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.
@@ -44,7 +44,7 @@ public class OracleTableMetaDataProvider extends GenericTableMetaDataProvider {
4444
private final boolean includeSynonyms;
4545

4646
@Nullable
47-
private String defaultSchema;
47+
private final String defaultSchema;
4848

4949

5050
/**
@@ -65,23 +65,27 @@ public OracleTableMetaDataProvider(DatabaseMetaData databaseMetaData, boolean in
6565

6666
super(databaseMetaData);
6767
this.includeSynonyms = includeSynonyms;
68-
69-
lookupDefaultSchema(databaseMetaData);
68+
this.defaultSchema = lookupDefaultSchema(databaseMetaData);
7069
}
7170

7271

7372
/*
7473
* Oracle-based implementation for detecting the current schema.
7574
*/
76-
private void lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
75+
@Nullable
76+
private static String lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
7777
try {
7878
CallableStatement cstmt = null;
7979
try {
80-
cstmt = databaseMetaData.getConnection().prepareCall(
81-
"{? = call sys_context('USERENV', 'CURRENT_SCHEMA')}");
80+
Connection con = databaseMetaData.getConnection();
81+
if (con == null) {
82+
logger.debug("Cannot check default schema - no Connection from DatabaseMetaData");
83+
return null;
84+
}
85+
cstmt = con.prepareCall("{? = call sys_context('USERENV', 'CURRENT_SCHEMA')}");
8286
cstmt.registerOutParameter(1, Types.VARCHAR);
8387
cstmt.execute();
84-
this.defaultSchema = cstmt.getString(1);
88+
return cstmt.getString(1);
8589
}
8690
finally {
8791
if (cstmt != null) {
@@ -90,7 +94,8 @@ private void lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
9094
}
9195
}
9296
catch (SQLException ex) {
93-
logger.debug("Encountered exception during default schema lookup", ex);
97+
logger.debug("Exception encountered during default schema lookup", ex);
98+
return null;
9499
}
95100
}
96101

@@ -116,6 +121,12 @@ public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData,
116121
}
117122

118123
Connection con = databaseMetaData.getConnection();
124+
if (con == null) {
125+
logger.warn("Unable to include synonyms in table metadata lookup - no Connection from DatabaseMetaData");
126+
super.initializeWithTableColumnMetaData(databaseMetaData, catalogName, schemaName, tableName);
127+
return;
128+
}
129+
119130
try {
120131
Class<?> oracleConClass = con.getClass().getClassLoader().loadClass("oracle.jdbc.OracleConnection");
121132
con = (Connection) con.unwrap(oracleConClass);
@@ -133,7 +144,7 @@ public void initializeWithTableColumnMetaData(DatabaseMetaData databaseMetaData,
133144
Boolean originalValueForIncludeSynonyms;
134145

135146
try {
136-
Method getIncludeSynonyms = con.getClass().getMethod("getIncludeSynonyms", (Class[]) null);
147+
Method getIncludeSynonyms = con.getClass().getMethod("getIncludeSynonyms");
137148
ReflectionUtils.makeAccessible(getIncludeSynonyms);
138149
originalValueForIncludeSynonyms = (Boolean) getIncludeSynonyms.invoke(con);
139150

0 commit comments

Comments
 (0)