Skip to content

Commit 35589af

Browse files
christophstroblschauder
authored andcommitted
Avoid conversion warnings for store specific simple types.
Dialects now can define a set of known simple types the driver can handle without further interaction. This is done to avoid warnings during converter registration for types known in one environment but not the other. Also move types around a bit, change visibility and make sure jdbc specific dialects inherit converters from their parents. Original pull request #981 See #935
1 parent 6114d8e commit 35589af

File tree

11 files changed

+118
-63
lines changed

11 files changed

+118
-63
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcCustomConversions.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.jdbc.core.convert;
1717

1818
import java.util.Arrays;
19+
import java.util.Collection;
1920
import java.util.Collections;
2021
import java.util.List;
2122
import java.util.function.Predicate;
@@ -30,14 +31,14 @@
3031
*
3132
* @author Mark Paluch
3233
* @author Jens Schauder
34+
* @author Christoph Strobl
3335
* @see CustomConversions
3436
* @see org.springframework.data.mapping.model.SimpleTypeHolder
3537
* @see JdbcSimpleTypes
3638
*/
3739
public class JdbcCustomConversions extends CustomConversions {
3840

39-
public static final List<Object> STORE_CONVERTERS = Arrays
40-
.asList(Jsr310TimestampBasedConverters.getConvertersToRegister().toArray());
41+
private static final Collection<Object> STORE_CONVERTERS = Collections.unmodifiableCollection(Jsr310TimestampBasedConverters.getConvertersToRegister());
4142
private static final StoreConversions STORE_CONVERSIONS = StoreConversions.of(JdbcSimpleTypes.HOLDER,
4243
STORE_CONVERTERS);
4344

@@ -77,6 +78,16 @@ public JdbcCustomConversions(ConverterConfiguration converterConfiguration) {
7778
super(converterConfiguration);
7879
}
7980

81+
/**
82+
* Obtain a read only copy of default store converters.
83+
*
84+
* @return never {@literal null}.
85+
* @since 2.3
86+
*/
87+
public static Collection<Object> storeConverters() {
88+
return STORE_CONVERTERS;
89+
}
90+
8091
private static boolean isDateTimeApiConversion(ConvertiblePair cp) {
8192

8293
if (cp.getSourceType().equals(java.util.Date.class)) {

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcDb2Dialect.java

+24
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,29 @@
1515
*/
1616
package org.springframework.data.jdbc.core.dialect;
1717

18+
import java.sql.Timestamp;
19+
import java.time.OffsetDateTime;
1820
import java.util.ArrayList;
1921
import java.util.Collection;
2022
import java.util.List;
2123

24+
import org.springframework.core.convert.converter.Converter;
25+
import org.springframework.data.convert.WritingConverter;
2226
import org.springframework.data.relational.core.dialect.Db2Dialect;
2327

2428
/**
2529
* {@link Db2Dialect} that registers JDBC specific converters.
2630
*
2731
* @author Jens Schauder
32+
* @author Christoph Strobl
2833
* @since 2.3
2934
*/
3035
public class JdbcDb2Dialect extends Db2Dialect {
3136

3237
public static JdbcDb2Dialect INSTANCE = new JdbcDb2Dialect();
3338

39+
protected JdbcDb2Dialect() {}
40+
3441
@Override
3542
public Collection<Object> getConverters() {
3643

@@ -40,4 +47,21 @@ public Collection<Object> getConverters() {
4047
return converters;
4148
}
4249

50+
/**
51+
* {@link WritingConverter} from {@link OffsetDateTime} to {@link Timestamp}. The conversion preserves the
52+
* {@link java.time.Instant} represented by {@link OffsetDateTime}
53+
*
54+
* @author Jens Schauder
55+
* @since 2.3
56+
*/
57+
@WritingConverter
58+
enum OffsetDateTimeToTimestampConverter implements Converter<OffsetDateTime, Timestamp> {
59+
60+
INSTANCE;
61+
62+
@Override
63+
public Timestamp convert(OffsetDateTime source) {
64+
return Timestamp.from(source.toInstant());
65+
}
66+
}
4367
}

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcH2Dialect.java

+16-9
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,43 @@
1515
*/
1616
package org.springframework.data.jdbc.core.dialect;
1717

18+
import java.time.OffsetDateTime;
19+
import java.time.ZoneOffset;
20+
import java.util.ArrayList;
21+
import java.util.Collection;
22+
import java.util.List;
23+
1824
import org.h2.api.TimestampWithTimeZone;
1925
import org.springframework.core.convert.converter.Converter;
2026
import org.springframework.data.convert.ReadingConverter;
2127
import org.springframework.data.relational.core.dialect.Db2Dialect;
2228
import org.springframework.data.relational.core.dialect.H2Dialect;
2329

24-
import java.time.OffsetDateTime;
25-
import java.time.ZoneOffset;
26-
import java.util.Collection;
27-
import java.util.Collections;
28-
2930
/**
3031
* {@link Db2Dialect} that registers JDBC specific converters.
3132
*
3233
* @author Jens Schauder
34+
* @author Christoph Strobl
3335
* @since 2.3
3436
*/
3537
public class JdbcH2Dialect extends H2Dialect {
3638

3739
public static JdbcH2Dialect INSTANCE = new JdbcH2Dialect();
3840

41+
protected JdbcH2Dialect() {}
42+
3943
@Override
4044
public Collection<Object> getConverters() {
41-
return Collections.singletonList(TimestampWithTimeZoneToOffsetDateTimeConverter.INSTANCE);
45+
46+
List<Object> converters = new ArrayList<>(super.getConverters());
47+
converters.add(TimestampWithTimeZoneToOffsetDateTimeConverter.INSTANCE);
48+
return converters;
4249
}
4350

4451
@ReadingConverter
4552
enum TimestampWithTimeZoneToOffsetDateTimeConverter implements Converter<TimestampWithTimeZone, OffsetDateTime> {
46-
INSTANCE;
4753

54+
INSTANCE;
4855

4956
@Override
5057
public OffsetDateTime convert(TimestampWithTimeZone source) {
@@ -67,8 +74,8 @@ public OffsetDateTime convert(TimestampWithTimeZone source) {
6774
nanosLeft -= nanosInSeconds;
6875
ZoneOffset offset = ZoneOffset.ofTotalSeconds(source.getTimeZoneOffsetSeconds());
6976

70-
return OffsetDateTime.of(source.getYear(), source.getMonth(), source.getDay(), (int)hours, (int)minutes, (int)seconds, (int)nanosLeft, offset );
71-
77+
return OffsetDateTime.of(source.getYear(), source.getMonth(), source.getDay(), (int) hours, (int) minutes,
78+
(int) seconds, (int) nanosLeft, offset);
7279
}
7380
}
7481
}

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcMySqlDialect.java

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
* {@link Db2Dialect} that registers JDBC specific converters.
3232
*
3333
* @author Jens Schauder
34+
* @author Christoph Strobl
3435
* @since 2.3
3536
*/
3637
public class JdbcMySqlDialect extends MySqlDialect {
@@ -39,6 +40,8 @@ public JdbcMySqlDialect(IdentifierProcessing identifierProcessing) {
3940
super(identifierProcessing);
4041
}
4142

43+
protected JdbcMySqlDialect() {}
44+
4245
@Override
4346
public Collection<Object> getConverters() {
4447

@@ -50,6 +53,7 @@ public Collection<Object> getConverters() {
5053

5154
@WritingConverter
5255
enum OffsetDateTimeToTimestampJdbcValueConverter implements Converter<OffsetDateTime, JdbcValue> {
56+
5357
INSTANCE;
5458

5559
@Override

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcSqlServerDialect.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
import microsoft.sql.DateTimeOffset;
1919

2020
import java.time.OffsetDateTime;
21+
import java.util.ArrayList;
2122
import java.util.Collection;
22-
import java.util.Collections;
23+
import java.util.List;
2324

2425
import org.springframework.core.convert.converter.Converter;
2526
import org.springframework.data.convert.ReadingConverter;
@@ -29,6 +30,7 @@
2930
* {@link SqlServerDialect} that registers JDBC specific converters.
3031
*
3132
* @author Jens Schauder
33+
* @author Christoph Strobl
3234
* @since 2.3
3335
*/
3436
public class JdbcSqlServerDialect extends SqlServerDialect {
@@ -37,11 +39,15 @@ public class JdbcSqlServerDialect extends SqlServerDialect {
3739

3840
@Override
3941
public Collection<Object> getConverters() {
40-
return Collections.singletonList(DateTimeOffsetToOffsetDateTimeConverter.INSTANCE);
42+
43+
List<Object> converters = new ArrayList<>(super.getConverters());
44+
converters.add(DateTimeOffsetToOffsetDateTimeConverter.INSTANCE);
45+
return converters;
4146
}
4247

4348
@ReadingConverter
4449
enum DateTimeOffsetToOffsetDateTimeConverter implements Converter<DateTimeOffset, OffsetDateTime> {
50+
4551
INSTANCE;
4652

4753
@Override

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/OffsetDateTimeToTimestampConverter.java

-41
This file was deleted.

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

+8-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.Lazy;
3232
import org.springframework.core.convert.converter.Converter;
3333
import org.springframework.data.convert.CustomConversions;
34+
import org.springframework.data.convert.CustomConversions.StoreConversions;
3435
import org.springframework.data.jdbc.core.JdbcAggregateOperations;
3536
import org.springframework.data.jdbc.core.JdbcAggregateTemplate;
3637
import org.springframework.data.jdbc.core.convert.BasicJdbcConverter;
@@ -41,9 +42,12 @@
4142
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
4243
import org.springframework.data.jdbc.core.convert.RelationResolver;
4344
import org.springframework.data.jdbc.core.convert.SqlGeneratorSource;
45+
import org.springframework.data.jdbc.core.dialect.JdbcDb2Dialect;
4446
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
4547
import org.springframework.data.jdbc.core.mapping.JdbcSimpleTypes;
48+
import org.springframework.data.mapping.model.SimpleTypeHolder;
4649
import org.springframework.data.relational.core.conversion.RelationalConverter;
50+
import org.springframework.data.relational.core.dialect.Db2Dialect;
4751
import org.springframework.data.relational.core.dialect.Dialect;
4852
import org.springframework.data.relational.core.mapping.NamingStrategy;
4953
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
@@ -116,9 +120,11 @@ public JdbcCustomConversions jdbcCustomConversions() {
116120
try {
117121

118122
Dialect dialect = applicationContext.getBean(Dialect.class);
123+
SimpleTypeHolder simpleTypeHolder = dialect.simpleTypes().isEmpty() ? JdbcSimpleTypes.HOLDER : new SimpleTypeHolder(dialect.simpleTypes(), JdbcSimpleTypes.HOLDER);
119124

120125
return new JdbcCustomConversions(
121-
CustomConversions.StoreConversions.of(JdbcSimpleTypes.HOLDER, storeConverters(dialect)), userConverters());
126+
CustomConversions.StoreConversions.of(simpleTypeHolder, storeConverters(dialect)), userConverters());
127+
122128
} catch (NoSuchBeanDefinitionException exception) {
123129

124130
LOG.warn("No dialect found. CustomConversions will be configured without dialect specific conversions.");
@@ -135,7 +141,7 @@ private List<Object> storeConverters(Dialect dialect) {
135141

136142
List<Object> converters = new ArrayList<>();
137143
converters.addAll(dialect.getConverters());
138-
converters.addAll(JdbcCustomConversions.STORE_CONVERTERS);
144+
converters.addAll(JdbcCustomConversions.storeConverters());
139145
return converters;
140146
}
141147

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/dialect/OffsetDateTimeToTimestampConverterUnitTests.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
*/
2626

2727
/**
28-
* Tests for {@link OffsetDateTimeToTimestampConverter}.
28+
* Tests for {@link JdbcDb2Dialect.OffsetDateTimeToTimestampConverter}.
2929
*
3030
* @author Jens Schauder
3131
*/
@@ -36,8 +36,8 @@ void conversionPreservesInstant() {
3636

3737
OffsetDateTime offsetDateTime = OffsetDateTime.of(5, 5, 5, 5,5,5,123456789, ZoneOffset.ofHours(3));
3838

39-
Timestamp timestamp = OffsetDateTimeToTimestampConverter.INSTANCE.convert(offsetDateTime);
39+
Timestamp timestamp = JdbcDb2Dialect.OffsetDateTimeToTimestampConverter.INSTANCE.convert(offsetDateTime);
4040

4141
assertThat(timestamp.toInstant()).isEqualTo(offsetDateTime.toInstant());
4242
}
43-
}
43+
}

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

+9-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.springframework.data.jdbc.testing;
1717

1818
import java.util.ArrayList;
19-
import java.util.Collection;
2019
import java.util.Collections;
2120
import java.util.List;
2221
import java.util.Optional;
@@ -45,6 +44,7 @@
4544
import org.springframework.data.jdbc.core.mapping.JdbcSimpleTypes;
4645
import org.springframework.data.jdbc.repository.config.DialectResolver;
4746
import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactory;
47+
import org.springframework.data.mapping.model.SimpleTypeHolder;
4848
import org.springframework.data.relational.core.dialect.Dialect;
4949
import org.springframework.data.relational.core.mapping.NamingStrategy;
5050
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
@@ -62,6 +62,7 @@
6262
* @author Mark Paluch
6363
* @author Fei Dong
6464
* @author Myeonghyeon Lee
65+
* @author Christoph Strobl
6566
*/
6667
@Configuration
6768
@ComponentScan // To pick up configuration classes (per activated profile)
@@ -114,15 +115,19 @@ JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy, C
114115

115116
@Bean
116117
CustomConversions jdbcCustomConversions(Dialect dialect) {
117-
return new JdbcCustomConversions(CustomConversions.StoreConversions.of(JdbcSimpleTypes.HOLDER,
118-
storeConverters(dialect)), Collections.emptyList());
118+
119+
SimpleTypeHolder simpleTypeHolder = dialect.simpleTypes().isEmpty() ? JdbcSimpleTypes.HOLDER
120+
: new SimpleTypeHolder(dialect.simpleTypes(), JdbcSimpleTypes.HOLDER);
121+
122+
return new JdbcCustomConversions(CustomConversions.StoreConversions.of(simpleTypeHolder, storeConverters(dialect)),
123+
Collections.emptyList());
119124
}
120125

121126
private List<Object> storeConverters(Dialect dialect) {
122127

123128
List<Object> converters = new ArrayList<>();
124129
converters.addAll(dialect.getConverters());
125-
converters.addAll(JdbcCustomConversions.STORE_CONVERTERS);
130+
converters.addAll(JdbcCustomConversions.storeConverters());
126131
return converters;
127132
}
128133

0 commit comments

Comments
 (0)