3333import org .springframework .context .annotation .Bean ;
3434import org .springframework .context .annotation .ComponentScan ;
3535import org .springframework .context .annotation .FilterType ;
36+ import org .springframework .context .annotation .Lazy ;
3637import org .springframework .data .annotation .Id ;
3738import org .springframework .data .jdbc .core .JdbcAggregateTemplate ;
39+ import org .springframework .data .jdbc .core .convert .BasicJdbcConverter ;
3840import org .springframework .data .jdbc .core .convert .DataAccessStrategy ;
3941import org .springframework .data .jdbc .core .convert .DefaultDataAccessStrategy ;
42+ import org .springframework .data .jdbc .core .convert .DefaultJdbcTypeFactory ;
4043import org .springframework .data .jdbc .core .convert .JdbcConverter ;
44+ import org .springframework .data .jdbc .core .convert .JdbcCustomConversions ;
4145import org .springframework .data .jdbc .core .convert .SqlGeneratorSource ;
46+ import org .springframework .data .jdbc .core .mapping .JdbcMappingContext ;
4247import org .springframework .data .jdbc .repository .QueryMappingConfiguration ;
4348import org .springframework .data .jdbc .repository .config .EnableJdbcRepositoriesIntegrationTests .TestConfiguration ;
4449import org .springframework .data .jdbc .repository .support .JdbcRepositoryFactoryBean ;
4550import org .springframework .data .mapping .PersistentEntity ;
4651import org .springframework .data .relational .core .dialect .Dialect ;
52+ import org .springframework .data .relational .core .mapping .NamingStrategy ;
4753import org .springframework .data .relational .core .mapping .RelationalMappingContext ;
4854import org .springframework .data .repository .CrudRepository ;
4955import org .springframework .jdbc .core .RowMapper ;
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 > {
0 commit comments