diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcAccessor.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcAccessor.java index 49772c6a4c..070ada3a30 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcAccessor.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 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. @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.SpringProperties; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -34,11 +35,19 @@ import org.springframework.util.Assert; * See {@link org.springframework.jdbc.core.JdbcTemplate}. * * @author Juergen Hoeller + * @author Sebastien Deleuze * @since 28.11.2003 * @see org.springframework.jdbc.core.JdbcTemplate */ public abstract class JdbcAccessor implements InitializingBean { + /** + * Boolean flag controlled by a {@code spring.xml.ignore} system property that instructs Spring to + * ignore XML, i.e. to not initialize the XML-related infrastructure. + *

The default is "false". + */ + private static final boolean shouldIgnoreXml = SpringProperties.getFlag("spring.xml.ignore"); + /** Logger available to subclasses. */ protected final Log logger = LogFactory.getLog(getClass()); @@ -87,7 +96,9 @@ public abstract class JdbcAccessor implements InitializingBean { * @see java.sql.DatabaseMetaData#getDatabaseProductName() */ public void setDatabaseProductName(String dbName) { - this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dbName); + if (!shouldIgnoreXml) { + this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dbName); + } } /** @@ -118,7 +129,10 @@ public abstract class JdbcAccessor implements InitializingBean { exceptionTranslator = this.exceptionTranslator; if (exceptionTranslator == null) { DataSource dataSource = getDataSource(); - if (dataSource != null) { + if (shouldIgnoreXml) { + exceptionTranslator = new SQLExceptionSubclassTranslator(); + } + else if (dataSource != null) { exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource); } else { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcTransactionManager.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcTransactionManager.java index aa48eb8d0e..b1cab0b75d 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcTransactionManager.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcTransactionManager.java @@ -20,6 +20,7 @@ import java.sql.SQLException; import javax.sql.DataSource; +import org.springframework.core.SpringProperties; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.lang.Nullable; @@ -43,6 +44,7 @@ import org.springframework.lang.Nullable; * may also throw such exceptions in their {@code flush} and {@code beforeCommit} phases. * * @author Juergen Hoeller + * @author Sebastien Deleuze * @since 5.3 * @see DataSourceTransactionManager * @see #setDataSource @@ -51,6 +53,14 @@ import org.springframework.lang.Nullable; @SuppressWarnings("serial") public class JdbcTransactionManager extends DataSourceTransactionManager { + /** + * Boolean flag controlled by a {@code spring.xml.ignore} system property that instructs Spring to + * ignore XML, i.e. to not initialize the XML-related infrastructure. + *

The default is "false". + */ + private static final boolean shouldIgnoreXml = SpringProperties.getFlag("spring.xml.ignore"); + + @Nullable private volatile SQLExceptionTranslator exceptionTranslator; @@ -87,7 +97,9 @@ public class JdbcTransactionManager extends DataSourceTransactionManager { * @see java.sql.DatabaseMetaData#getDatabaseProductName() */ public void setDatabaseProductName(String dbName) { - this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dbName); + if (!shouldIgnoreXml) { + this.exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dbName); + } } /** @@ -116,7 +128,12 @@ public class JdbcTransactionManager extends DataSourceTransactionManager { synchronized (this) { exceptionTranslator = this.exceptionTranslator; if (exceptionTranslator == null) { - exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(obtainDataSource()); + if (shouldIgnoreXml) { + exceptionTranslator = new SQLExceptionSubclassTranslator(); + } + else { + exceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(obtainDataSource()); + } this.exceptionTranslator = exceptionTranslator; } return exceptionTranslator;