Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 9893acc

Browse files
committedJul 13, 2021
recommit
1 parent 95b2db5 commit 9893acc

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed
 

‎spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositories.java

+8
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
* @author Mark Paluch
4040
* @author Fei Dong
4141
* @author Antoine Sauray
42+
* @author Tomohiko Ozawa
4243
* @see AbstractJdbcConfiguration
4344
*/
4445
@Target(ElementType.TYPE)
@@ -131,4 +132,11 @@
131132
*/
132133
String transactionManagerRef() default "transactionManager";
133134

135+
/**
136+
* Configures the name of the {@link org.springframework.data.jdbc.core.convert.JdbcConverter} bean definition to be
137+
* used to create repositories discovered through this annotation. Defaults to {@code converter}.
138+
*
139+
* @since 2.3
140+
*/
141+
String jdbcConverterRef() default "converter";
134142
}

‎spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
* @author Fei Dong
3737
* @author Mark Paluch
3838
* @author Antoine Sauray
39+
* @author Tomohiko Ozawa
3940
*/
4041
public class JdbcRepositoryConfigExtension extends RepositoryConfigurationExtensionSupport {
4142

@@ -85,6 +86,9 @@ public void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSo
8586

8687
Optional<String> transactionManagerRef = source.getAttribute("transactionManagerRef");
8788
builder.addPropertyValue("transactionManager", transactionManagerRef.orElse(DEFAULT_TRANSACTION_MANAGER_BEAN_NAME));
89+
90+
source.getAttribute("jdbcConverterRef").filter(StringUtils::hasText) //
91+
.ifPresent(s -> builder.addPropertyReference("converter", s));
8892
}
8993

9094
/**

‎spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/EnableJdbcRepositoriesIntegrationTests.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,23 @@
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.ComponentScan;
3535
import org.springframework.context.annotation.FilterType;
36+
import org.springframework.context.annotation.Lazy;
3637
import org.springframework.data.annotation.Id;
3738
import org.springframework.data.jdbc.core.JdbcAggregateTemplate;
39+
import org.springframework.data.jdbc.core.convert.BasicJdbcConverter;
3840
import org.springframework.data.jdbc.core.convert.DataAccessStrategy;
3941
import org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy;
42+
import org.springframework.data.jdbc.core.convert.DefaultJdbcTypeFactory;
4043
import org.springframework.data.jdbc.core.convert.JdbcConverter;
44+
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
4145
import org.springframework.data.jdbc.core.convert.SqlGeneratorSource;
46+
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
4247
import org.springframework.data.jdbc.repository.QueryMappingConfiguration;
4348
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositoriesIntegrationTests.TestConfiguration;
4449
import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean;
4550
import org.springframework.data.mapping.PersistentEntity;
4651
import org.springframework.data.relational.core.dialect.Dialect;
52+
import org.springframework.data.relational.core.mapping.NamingStrategy;
4753
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
4854
import org.springframework.data.repository.CrudRepository;
4955
import org.springframework.jdbc.core.RowMapper;
@@ -60,6 +66,7 @@
6066
* @author Greg Turnquist
6167
* @author Evgeni Dimitrov
6268
* @author Fei Dong
69+
* @author Tomohiko Ozawa
6370
*/
6471
@ExtendWith(SpringExtension.class)
6572
@ContextConfiguration(classes = TestConfiguration.class)
@@ -70,22 +77,26 @@ public class EnableJdbcRepositoriesIntegrationTests {
7077
static final Field OPERATIONS = ReflectionUtils.findField(JdbcRepositoryFactoryBean.class, "operations");
7178
static final Field DATA_ACCESS_STRATEGY = ReflectionUtils.findField(JdbcRepositoryFactoryBean.class,
7279
"dataAccessStrategy");
80+
static final Field CONVERTER = ReflectionUtils.findField(JdbcRepositoryFactoryBean.class, "converter");
7381
public static final RowMapper DUMMY_ENTITY_ROW_MAPPER = mock(RowMapper.class);
7482
public static final RowMapper STRING_ROW_MAPPER = mock(RowMapper.class);
7583

7684
@Autowired JdbcRepositoryFactoryBean factoryBean;
7785
@Autowired DummyRepository repository;
7886
@Autowired @Qualifier("namedParameterJdbcTemplate") NamedParameterJdbcOperations defaultOperations;
7987
@Autowired @Qualifier("defaultDataAccessStrategy") DataAccessStrategy defaultDataAccessStrategy;
88+
@Autowired @Qualifier("converter") JdbcConverter defaultJdbcConverter;
8089
@Autowired @Qualifier("qualifierJdbcOperations") NamedParameterJdbcOperations qualifierJdbcOperations;
8190
@Autowired @Qualifier("qualifierDataAccessStrategy") DataAccessStrategy qualifierDataAccessStrategy;
91+
@Autowired @Qualifier("qualifierJdbcConverter") JdbcConverter qualifierJdbcConverter;
8292

8393
@BeforeAll
8494
public static void setup() {
8595

8696
MAPPER_MAP.setAccessible(true);
8797
OPERATIONS.setAccessible(true);
8898
DATA_ACCESS_STRATEGY.setAccessible(true);
99+
CONVERTER.setAccessible(true);
89100
}
90101

91102
@Test // DATAJDBC-100
@@ -118,6 +129,9 @@ public void jdbcOperationsRef() {
118129
DataAccessStrategy dataAccessStrategy = (DataAccessStrategy) ReflectionUtils.getField(DATA_ACCESS_STRATEGY,
119130
factoryBean);
120131
assertThat(dataAccessStrategy).isNotSameAs(defaultDataAccessStrategy).isSameAs(qualifierDataAccessStrategy);
132+
133+
JdbcConverter converter = (JdbcConverter) ReflectionUtils.getField(CONVERTER, factoryBean);
134+
assertThat(converter).isNotSameAs(defaultJdbcConverter).isSameAs(qualifierJdbcConverter);
121135
}
122136

123137
interface DummyRepository extends CrudRepository<DummyEntity, Long> {
@@ -133,7 +147,7 @@ static class DummyEntity {
133147
@EnableJdbcRepositories(considerNestedRepositories = true,
134148
includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = DummyRepository.class),
135149
jdbcOperationsRef = "qualifierJdbcOperations", dataAccessStrategyRef = "qualifierDataAccessStrategy",
136-
repositoryBaseClass = DummyRepositoryBaseClass.class)
150+
jdbcConverterRef = "qualifierJdbcConverter", repositoryBaseClass = DummyRepositoryBaseClass.class)
137151
static class TestConfiguration {
138152

139153
@Bean
@@ -166,6 +180,19 @@ DataAccessStrategy defaultDataAccessStrategy(
166180
Dialect jdbcDialect(@Qualifier("qualifierJdbcOperations") NamedParameterJdbcOperations operations) {
167181
return DialectResolver.getDialect(operations.getJdbcOperations());
168182
}
183+
184+
@Bean("qualifierJdbcConverter")
185+
JdbcConverter qualifierJdbcConverter(Optional<NamingStrategy> namingStrategy,
186+
@Qualifier("qualifierJdbcOperations") NamedParameterJdbcOperations operations,
187+
@Lazy @Qualifier("qualifierDataAccessStrategy") DataAccessStrategy dataAccessStrategy) {
188+
JdbcCustomConversions conversions = new JdbcCustomConversions();
189+
JdbcMappingContext mappingContext = new JdbcMappingContext(namingStrategy.orElse(NamingStrategy.INSTANCE));
190+
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
191+
DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(operations.getJdbcOperations());
192+
Dialect dialect = DialectResolver.getDialect(operations.getJdbcOperations());
193+
return new BasicJdbcConverter(mappingContext, dataAccessStrategy, conversions, jdbcTypeFactory,
194+
dialect.getIdentifierProcessing());
195+
}
169196
}
170197

171198
private static class DummyRepositoryBaseClass<T, ID> implements CrudRepository<T, ID> {

‎spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestConfiguration.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
* @author Fei Dong
6464
* @author Myeonghyeon Lee
6565
* @author Christoph Strobl
66+
* @author Tomohiko Ozawa
6667
*/
6768
@Configuration
6869
@ComponentScan // To pick up configuration classes (per activated profile)
@@ -132,7 +133,7 @@ private List<Object> storeConverters(Dialect dialect) {
132133
}
133134

134135
@Bean
135-
JdbcConverter relationalConverter(RelationalMappingContext mappingContext, @Lazy RelationResolver relationResolver,
136+
JdbcConverter converter(RelationalMappingContext mappingContext, @Lazy RelationResolver relationResolver,
136137
CustomConversions conversions, @Qualifier("namedParameterJdbcTemplate") NamedParameterJdbcOperations template,
137138
Dialect dialect) {
138139

0 commit comments

Comments
 (0)
Please sign in to comment.