|
|
|
@ -6,10 +6,18 @@ import java.util.Collection; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import java.util.function.Consumer; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.core.convert.converter.Converter; |
|
|
|
|
|
|
|
import org.springframework.core.convert.converter.ConverterFactory; |
|
|
|
|
|
|
|
import org.springframework.core.convert.converter.GenericConverter; |
|
|
|
|
|
|
|
import org.springframework.data.convert.ConverterBuilder; |
|
|
|
import org.springframework.data.convert.CustomConversions; |
|
|
|
import org.springframework.data.convert.CustomConversions; |
|
|
|
import org.springframework.data.r2dbc.dialect.R2dbcDialect; |
|
|
|
import org.springframework.data.r2dbc.dialect.R2dbcDialect; |
|
|
|
import org.springframework.data.r2dbc.mapping.R2dbcSimpleTypeHolder; |
|
|
|
import org.springframework.data.r2dbc.mapping.R2dbcSimpleTypeHolder; |
|
|
|
|
|
|
|
import org.springframework.data.relational.core.dialect.Dialect; |
|
|
|
|
|
|
|
import org.springframework.lang.Contract; |
|
|
|
|
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Value object to capture custom conversion. {@link R2dbcCustomConversions} also act as factory for |
|
|
|
* Value object to capture custom conversion. {@link R2dbcCustomConversions} also act as factory for |
|
|
|
@ -70,11 +78,27 @@ public class R2dbcCustomConversions extends CustomConversions { |
|
|
|
* @since 1.2 |
|
|
|
* @since 1.2 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static R2dbcCustomConversions of(R2dbcDialect dialect, Collection<?> converters) { |
|
|
|
public static R2dbcCustomConversions of(R2dbcDialect dialect, Collection<?> converters) { |
|
|
|
|
|
|
|
return create(dialect, configurer -> configurer.registerConverters(converters)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Create a new {@link R2dbcCustomConversions} instance using the given {@link R2dbcDialect} and |
|
|
|
|
|
|
|
* {@link R2dbcConverterConfigurer} callback to configure converters. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param dialect the {@link Dialect} to use, must not be {@literal null}. |
|
|
|
|
|
|
|
* @param configurer the configurer callback to configure converters, must not be {@literal null}. |
|
|
|
|
|
|
|
* @return a new {@link R2dbcCustomConversions} instance configured from the given dialect and configured converters. |
|
|
|
|
|
|
|
* @since 4.0 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public static R2dbcCustomConversions create(R2dbcDialect dialect, Consumer<R2dbcConverterConfigurer> configurer) { |
|
|
|
|
|
|
|
|
|
|
|
List<Object> storeConverters = new ArrayList<>(dialect.getConverters()); |
|
|
|
Assert.notNull(dialect, "Dialect must not be null"); |
|
|
|
storeConverters.addAll(R2dbcCustomConversions.STORE_CONVERTERS); |
|
|
|
Assert.notNull(configurer, "R2dbcConverterConfigurer Consumer must not be null"); |
|
|
|
|
|
|
|
|
|
|
|
return new R2dbcCustomConversions(StoreConversions.of(dialect.getSimpleTypeHolder(), storeConverters), converters); |
|
|
|
R2dbcConverterConfigurer converterConfigurer = R2dbcConverterConfigurer.from(dialect); |
|
|
|
|
|
|
|
configurer.accept(converterConfigurer); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new R2dbcCustomConversions(converterConfigurer.createConfiguration()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static class R2dbcCustomConversionsConfiguration extends ConverterConfiguration { |
|
|
|
static class R2dbcCustomConversionsConfiguration extends ConverterConfiguration { |
|
|
|
@ -92,4 +116,112 @@ public class R2dbcCustomConversions extends CustomConversions { |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* {@link R2dbcConverterConfigurer} encapsulates creation of {@link R2dbcCustomConversionsConfiguration} with R2DBC |
|
|
|
|
|
|
|
* specifics. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @author Mark Paluch |
|
|
|
|
|
|
|
* @since 4.0 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public static class R2dbcConverterConfigurer { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final StoreConversions storeConversions; |
|
|
|
|
|
|
|
private final List<Object> customConverters = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private R2dbcConverterConfigurer(StoreConversions storeConversions) { |
|
|
|
|
|
|
|
this.storeConversions = storeConversions; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Create a {@link R2dbcConverterConfigurer} using the provided {@code dialect} and our own codecs for JSR-310 |
|
|
|
|
|
|
|
* types. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param dialect must not be {@literal null}. |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
static R2dbcConverterConfigurer from(R2dbcDialect dialect) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<Object> converters = new ArrayList<>(); |
|
|
|
|
|
|
|
converters.addAll(dialect.getConverters()); |
|
|
|
|
|
|
|
converters.addAll(R2dbcCustomConversions.STORE_CONVERTERS); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StoreConversions storeConversions = StoreConversions.of(dialect.getSimpleTypeHolder(), converters); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new R2dbcConverterConfigurer(storeConversions); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Create a {@link R2dbcConverterConfigurer} using the provided {@code storeConversions}. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param storeConversions must not be {@literal null}. |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
static R2dbcConverterConfigurer from(StoreConversions storeConversions) { |
|
|
|
|
|
|
|
return new R2dbcConverterConfigurer(storeConversions); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Add a custom {@link Converter} implementation. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param converter must not be {@literal null}. |
|
|
|
|
|
|
|
* @return this. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Contract("_ -> this") |
|
|
|
|
|
|
|
public R2dbcConverterConfigurer registerConverter(Converter<?, ?> converter) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.notNull(converter, "Converter must not be null"); |
|
|
|
|
|
|
|
customConverters.add(converter); |
|
|
|
|
|
|
|
return this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Add {@link Converter converters}, {@link ConverterFactory factories}, {@link ConverterBuilder.ConverterAware |
|
|
|
|
|
|
|
* converter-aware objects}, and {@link GenericConverter generic converters}. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param converters must not be {@literal null} nor contain {@literal null} values. |
|
|
|
|
|
|
|
* @return this. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Contract("_ -> this") |
|
|
|
|
|
|
|
public R2dbcConverterConfigurer registerConverters(Object... converters) { |
|
|
|
|
|
|
|
return registerConverters(Arrays.asList(converters)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Add {@link Converter converters}, {@link ConverterFactory factories}, {@link ConverterBuilder.ConverterAware |
|
|
|
|
|
|
|
* converter-aware objects}, and {@link GenericConverter generic converters}. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param converters must not be {@literal null} nor contain {@literal null} values. |
|
|
|
|
|
|
|
* @return this. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Contract("_ -> this") |
|
|
|
|
|
|
|
public R2dbcConverterConfigurer registerConverters(Collection<?> converters) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.notNull(converters, "Converters must not be null"); |
|
|
|
|
|
|
|
Assert.noNullElements(converters, "Converters must not be null nor contain null values"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
customConverters.addAll(converters); |
|
|
|
|
|
|
|
return this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Add a custom {@link ConverterFactory} implementation. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param converterFactory must not be {@literal null}. |
|
|
|
|
|
|
|
* @return this. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Contract("_ -> this") |
|
|
|
|
|
|
|
public R2dbcConverterConfigurer registerConverterFactory(ConverterFactory<?, ?> converterFactory) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Assert.notNull(converterFactory, "ConverterFactory must not be null"); |
|
|
|
|
|
|
|
customConverters.add(converterFactory); |
|
|
|
|
|
|
|
return this; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ConverterConfiguration createConfiguration() { |
|
|
|
|
|
|
|
return new R2dbcCustomConversionsConfiguration(storeConversions, this.customConverters); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|