Skip to content

Commit ef671e7

Browse files
committed
Merge pull request #7561 from kazuki43zoo/support-externalized-properties-on-tx
* pr/7561: Polish spring transaction manager properties Support spring transaction manager properties
2 parents 30ea133 + 99e7266 commit ef671e7

21 files changed

+301
-18
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@
3333
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
3434
import org.springframework.orm.jpa.JpaTransactionManager;
3535
import org.springframework.transaction.PlatformTransactionManager;
36+
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
3637
import org.springframework.util.StringUtils;
3738

3839
/**
3940
* Basic {@link BatchConfigurer} implementation.
4041
*
4142
* @author Dave Syer
4243
* @author Andy Wilkinson
44+
* @author Kazuki Shimizu
4345
*/
4446
public class BasicBatchConfigurer implements BatchConfigurer {
4547

@@ -150,6 +152,12 @@ protected JobRepository createJobRepository() throws Exception {
150152
}
151153

152154
protected PlatformTransactionManager createTransactionManager() {
155+
AbstractPlatformTransactionManager transactionManager = createAppropriateTransactionManager();
156+
this.properties.getTransaction().applyTo(transactionManager);
157+
return transactionManager;
158+
}
159+
160+
private AbstractPlatformTransactionManager createAppropriateTransactionManager() {
153161
if (this.entityManagerFactory != null) {
154162
return new JpaTransactionManager(this.entityManagerFactory);
155163
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.context.annotation.Configuration;
4343
import org.springframework.core.io.ResourceLoader;
4444
import org.springframework.jdbc.core.JdbcOperations;
45+
import org.springframework.transaction.PlatformTransactionManager;
4546
import org.springframework.util.StringUtils;
4647

4748
/**
@@ -57,6 +58,7 @@
5758
*
5859
* @author Dave Syer
5960
* @author Eddú Meléndez
61+
* @author Kazuki Shimizu
6062
*/
6163
@Configuration
6264
@ConditionalOnClass({ JobLauncher.class, DataSource.class, JdbcOperations.class })
@@ -133,7 +135,8 @@ public SimpleJobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLau
133135
return factory;
134136
}
135137

136-
@ConditionalOnClass(name = "javax.persistence.EntityManagerFactory")
138+
@EnableConfigurationProperties(BatchProperties.class)
139+
@ConditionalOnClass(value = PlatformTransactionManager.class, name = "javax.persistence.EntityManagerFactory")
137140
@ConditionalOnMissingBean(BatchConfigurer.class)
138141
@Configuration
139142
protected static class JpaBatchConfiguration {

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package org.springframework.boot.autoconfigure.batch;
1818

19+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
1920
import org.springframework.boot.context.properties.ConfigurationProperties;
21+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2022

2123
/**
2224
* Configuration properties for Spring Batch.
@@ -46,6 +48,9 @@ public class BatchProperties {
4648

4749
private final Job job = new Job();
4850

51+
@NestedConfigurationProperty
52+
private final TransactionProperties transaction = new TransactionProperties();
53+
4954
public String getSchema() {
5055
return this.schema;
5156
}
@@ -54,6 +59,14 @@ public void setSchema(String schema) {
5459
this.schema = schema;
5560
}
5661

62+
public String getTablePrefix() {
63+
return this.tablePrefix;
64+
}
65+
66+
public void setTablePrefix(String tablePrefix) {
67+
this.tablePrefix = tablePrefix;
68+
}
69+
5770
public Initializer getInitializer() {
5871
return this.initializer;
5972
}
@@ -62,12 +75,8 @@ public Job getJob() {
6275
return this.job;
6376
}
6477

65-
public void setTablePrefix(String tablePrefix) {
66-
this.tablePrefix = tablePrefix;
67-
}
68-
69-
public String getTablePrefix() {
70-
return this.tablePrefix;
78+
public TransactionProperties getTransaction() {
79+
return this.transaction;
7180
}
7281

7382
public class Initializer {

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@
4848
* @author Josh Long
4949
* @author Vince Bickers
5050
* @author Stephane Nicoll
51+
* @author Kazuki Shimizu
5152
* @since 1.4.0
5253
*/
5354
@Configuration
54-
@ConditionalOnClass(SessionFactory.class)
55+
@ConditionalOnClass({ SessionFactory.class, PlatformTransactionManager.class })
5556
@ConditionalOnMissingBean(SessionFactory.class)
5657
@EnableConfigurationProperties(Neo4jProperties.class)
5758
@SuppressWarnings("deprecation")
@@ -87,8 +88,12 @@ public Neo4jTemplate neo4jTemplate(SessionFactory sessionFactory) {
8788

8889
@Bean
8990
@ConditionalOnMissingBean(PlatformTransactionManager.class)
90-
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory) {
91-
return new Neo4jTransactionManager(sessionFactory);
91+
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory,
92+
Neo4jProperties properties) {
93+
Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(
94+
sessionFactory);
95+
properties.getTransaction().applyTo(transactionManager);
96+
return transactionManager;
9297
}
9398

9499
private String[] getPackagesToScan(ApplicationContext applicationContext) {

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jProperties.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import org.neo4j.ogm.config.DriverConfiguration;
2424

2525
import org.springframework.beans.BeansException;
26+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
2627
import org.springframework.boot.context.properties.ConfigurationProperties;
28+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2729
import org.springframework.context.ApplicationContext;
2830
import org.springframework.context.ApplicationContextAware;
2931
import org.springframework.util.ClassUtils;
@@ -69,6 +71,9 @@ public class Neo4jProperties implements ApplicationContextAware {
6971

7072
private final Embedded embedded = new Embedded();
7173

74+
@NestedConfigurationProperty
75+
private final TransactionProperties transaction = new TransactionProperties();
76+
7277
private ClassLoader classLoader = Neo4jProperties.class.getClassLoader();
7378

7479
public String getUri() {
@@ -107,6 +112,10 @@ public Embedded getEmbedded() {
107112
return this.embedded;
108113
}
109114

115+
public TransactionProperties getTransaction() {
116+
return this.transaction;
117+
}
118+
110119
@Override
111120
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
112121
this.classLoader = ctx.getClassLoader();

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import org.springframework.beans.factory.BeanClassLoaderAware;
2828
import org.springframework.beans.factory.BeanCreationException;
2929
import org.springframework.beans.factory.InitializingBean;
30+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3031
import org.springframework.boot.context.properties.ConfigurationProperties;
32+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
3133
import org.springframework.boot.jdbc.DatabaseDriver;
3234
import org.springframework.context.EnvironmentAware;
3335
import org.springframework.core.env.Environment;
@@ -157,6 +159,9 @@ public class DataSourceProperties
157159

158160
private String uniqueName;
159161

162+
@NestedConfigurationProperty
163+
private final TransactionProperties transaction = new TransactionProperties();
164+
160165
@Override
161166
public void setBeanClassLoader(ClassLoader classLoader) {
162167
this.classLoader = classLoader;
@@ -473,6 +478,10 @@ public void setXa(Xa xa) {
473478
this.xa = xa;
474479
}
475480

481+
public TransactionProperties getTransaction() {
482+
return this.transaction;
483+
}
484+
476485
/**
477486
* XA Specific datasource settings.
478487
*/

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
26+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2627
import org.springframework.context.annotation.Bean;
2728
import org.springframework.context.annotation.Configuration;
2829
import org.springframework.core.Ordered;
@@ -39,10 +40,12 @@
3940
* @author Dave Syer
4041
* @author Stephane Nicoll
4142
* @author Andy Wilkinson
43+
* @author Kazuki Shimizu
4244
*/
4345
@Configuration
4446
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
4547
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
48+
@EnableConfigurationProperties(DataSourceProperties.class)
4649
public class DataSourceTransactionManagerAutoConfiguration {
4750

4851
@Configuration
@@ -57,8 +60,12 @@ static class DataSourceTransactionManagerConfiguration {
5760

5861
@Bean
5962
@ConditionalOnMissingBean(PlatformTransactionManager.class)
60-
public DataSourceTransactionManager transactionManager() {
61-
return new DataSourceTransactionManager(this.dataSource);
63+
public DataSourceTransactionManager transactionManager(
64+
DataSourceProperties properties) {
65+
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(
66+
this.dataSource);
67+
properties.getTransaction().applyTo(transactionManager);
68+
return transactionManager;
6269
}
6370

6471
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
* @author Dave Syer
6060
* @author Oliver Gierke
6161
* @author Andy Wilkinson
62+
* @author Kazuki Shimizu
6263
*/
6364
@EnableConfigurationProperties(JpaProperties.class)
6465
@Import(DataSourceInitializedPublisher.Registrar.class)
@@ -82,7 +83,9 @@ protected JpaBaseConfiguration(DataSource dataSource, JpaProperties properties,
8283
@Bean
8384
@ConditionalOnMissingBean(PlatformTransactionManager.class)
8485
public PlatformTransactionManager transactionManager() {
85-
return new JpaTransactionManager();
86+
JpaTransactionManager transactionManager = new JpaTransactionManager();
87+
this.properties.getTransaction().applyTo(transactionManager);
88+
return transactionManager;
8689
}
8790

8891
@Bean

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaProperties.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.sql.DataSource;
2323

2424
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection;
25+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
2526
import org.springframework.boot.context.properties.ConfigurationProperties;
2627
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2728
import org.springframework.orm.jpa.vendor.Database;
@@ -67,6 +68,9 @@ public class JpaProperties {
6768

6869
private Hibernate hibernate = new Hibernate();
6970

71+
@NestedConfigurationProperty
72+
private final TransactionProperties transaction = new TransactionProperties();
73+
7074
public Map<String, String> getProperties() {
7175
return this.properties;
7276
}
@@ -125,6 +129,10 @@ public Map<String, String> getHibernateProperties(DataSource dataSource) {
125129
return this.hibernate.getAdditionalProperties(this.properties, dataSource);
126130
}
127131

132+
public TransactionProperties getTransaction() {
133+
return this.transaction;
134+
}
135+
128136
public static class Hibernate {
129137

130138
private static final String USE_NEW_ID_GENERATOR_MAPPINGS = "hibernate.id."
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright 2012-2016 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.transaction;
18+
19+
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
20+
21+
/**
22+
* Nested configuration properties that can be applied to an
23+
* {@link AbstractPlatformTransactionManager}.
24+
*
25+
* @author Kazuki Shimizu
26+
* @since 1.5.0
27+
*/
28+
public class TransactionProperties {
29+
30+
/**
31+
* Default transaction timeout in seconds.
32+
*/
33+
private Integer defaultTimeout;
34+
35+
/**
36+
* Perform the rollback on commit failurures.
37+
*/
38+
private Boolean rollbackOnCommitFailure;
39+
40+
public Integer getDefaultTimeout() {
41+
return this.defaultTimeout;
42+
}
43+
44+
public void setDefaultTimeout(Integer defaultTimeout) {
45+
this.defaultTimeout = defaultTimeout;
46+
}
47+
48+
public Boolean getRollbackOnCommitFailure() {
49+
return this.rollbackOnCommitFailure;
50+
}
51+
52+
public void setRollbackOnCommitFailure(Boolean rollbackOnCommitFailure) {
53+
this.rollbackOnCommitFailure = rollbackOnCommitFailure;
54+
}
55+
56+
/**
57+
* Apply all transaction custom properties to the specified transaction manager.
58+
* @param transactionManager the target transaction manager
59+
*/
60+
public void applyTo(AbstractPlatformTransactionManager transactionManager) {
61+
if (this.defaultTimeout != null) {
62+
transactionManager.setDefaultTimeout(this.defaultTimeout);
63+
}
64+
if (this.rollbackOnCommitFailure != null) {
65+
transactionManager.setRollbackOnCommitFailure(this.rollbackOnCommitFailure);
66+
}
67+
}
68+
69+
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/transaction/jta/AtomikosJtaConfiguration.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@
5050
* @author Phillip Webb
5151
* @author Andy Wilkinson
5252
* @author Stephane Nicoll
53+
* @author Kazuki Shimizu
5354
* @since 1.2.0
5455
*/
5556
@Configuration
56-
@EnableConfigurationProperties(AtomikosProperties.class)
57+
@EnableConfigurationProperties({ AtomikosProperties.class, JtaProperties.class })
5758
@ConditionalOnClass({ JtaTransactionManager.class, UserTransactionManager.class })
5859
@ConditionalOnMissingBean(PlatformTransactionManager.class)
5960
class AtomikosJtaConfiguration {
@@ -111,7 +112,10 @@ public static AtomikosDependsOnBeanFactoryPostProcessor atomikosDependsOnBeanFac
111112
@Bean
112113
public JtaTransactionManager transactionManager(UserTransaction userTransaction,
113114
TransactionManager transactionManager) {
114-
return new JtaTransactionManager(userTransaction, transactionManager);
115+
JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(
116+
userTransaction, transactionManager);
117+
this.jtaProperties.getTransaction().applyTo(jtaTransactionManager);
118+
return jtaTransactionManager;
115119
}
116120

117121
@Configuration

0 commit comments

Comments
 (0)