diff --git a/grails-plugin-databinding/build.gradle b/grails-plugin-databinding/build.gradle index 51444dc6b0..91f09858f0 100644 --- a/grails-plugin-databinding/build.gradle +++ b/grails-plugin-databinding/build.gradle @@ -1,14 +1,4 @@ dependencies { - annotationProcessor "io.micronaut:micronaut-inject-java:$micronautVersion" - annotationProcessor "io.micronaut.spring:micronaut-spring-boot-annotation:$micronautSpringVersion" - annotationProcessor "io.micronaut.cache:micronaut-cache-core:$micronautCacheVersion" - - compileOnly "io.micronaut:micronaut-inject-java:$micronautVersion" - compileOnly "io.micronaut.spring:micronaut-spring-annotation:$micronautSpringVersion" - compileOnly "io.micronaut.cache:micronaut-cache-core:$micronautCacheVersion" - compileOnly "io.micronaut:micronaut-runtime:$micronautVersion" - - api "javax.inject:javax.inject:1" api project(':grails-core') api project(':grails-plugin-api') api project(':grails-plugin-core') @@ -16,9 +6,7 @@ testImplementation project(':grails-boot') testImplementation project(':grails-test-suite-base') - testImplementation "io.micronaut.spring:micronaut-spring-context:$micronautSpringVersion" testImplementation "org.grails:grails-web-testing-support:$testingSupportVersionForTests", { - exclude module:'grails-plugin-codecs' exclude module:'grails-plugin-rest' exclude module:'grails-plugin-interceptors' exclude module:'grails-test' diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java b/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java index 1da5eb107b..5d138a06f0 100644 --- a/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java +++ b/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2019 the original author or authors. + * Copyright 2004-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,13 @@ package org.grails.databinding.converters; -import grails.core.GrailsApplication; import grails.databinding.TypedStructuredBindingEditor; import grails.databinding.converters.FormattedValueConverter; import grails.databinding.converters.ValueConverter; import org.grails.databinding.converters.web.LocaleAwareBigDecimalConverter; import org.grails.databinding.converters.web.LocaleAwareNumberConverter; import org.grails.plugins.databinding.DataBindingConfigurationProperties; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; @@ -34,246 +33,247 @@ /** * Default converters configuration. */ -@Configuration +@Configuration(proxyBeanMethods = false) public class DefaultConvertersConfiguration { private final DataBindingConfigurationProperties configurationProperties; private final LocaleResolver localResolver; private final Jsr310ConvertersConfiguration jsr310ConvertersConfiguration; - public DefaultConvertersConfiguration(GrailsApplication grailsApplication, DataBindingConfigurationProperties configurationProperties) { + public DefaultConvertersConfiguration(ObjectProvider localeResolverProvider, + DataBindingConfigurationProperties configurationProperties) { this.configurationProperties = configurationProperties; - jsr310ConvertersConfiguration = new Jsr310ConvertersConfiguration(configurationProperties); - LocaleResolver localResolver; - try { - localResolver = grailsApplication.getMainContext().getBean(LocaleResolver.class); - } catch (NoSuchBeanDefinitionException e) { - localResolver = null; - } - this.localResolver = localResolver; + this.jsr310ConvertersConfiguration = new Jsr310ConvertersConfiguration(configurationProperties); + this.localResolver = localeResolverProvider.getIfAvailable(); } /** * @return The default currency converter */ - @Bean("defaultCurrencyConverter") - protected CurrencyValueConverter defaultCurrencyConverter() { + @Bean + public CurrencyValueConverter defaultCurrencyConverter() { return new CurrencyValueConverter(); } - @Bean("defaultGrailsBigDecimalConverter") - protected ValueConverter defaultGrailsBigDecimalConverter() { + @Bean + public ValueConverter defaultGrailsBigDecimalConverter() { LocaleAwareBigDecimalConverter converter = new LocaleAwareBigDecimalConverter(); converter.setTargetType(BigDecimal.class); converter.setLocaleResolver(localResolver); return converter; } - @Bean("offsetDateTimeConverter") - FormattedValueConverter offsetDateTimeConverter() { + @Bean + public FormattedValueConverter offsetDateTimeConverter() { return jsr310ConvertersConfiguration.offsetDateTimeConverter(); } - @Bean("offsetDateTimeValueConverter") - ValueConverter offsetDateTimeValueConverter() { + @Bean + public ValueConverter offsetDateTimeValueConverter() { return jsr310ConvertersConfiguration.offsetDateTimeValueConverter(); } - @Bean("offsetDateTimeStructuredBindingEditor") - TypedStructuredBindingEditor offsetDateTimeStructuredBindingEditor() { + @SuppressWarnings("rawtypes") + @Bean + public TypedStructuredBindingEditor offsetDateTimeStructuredBindingEditor() { return jsr310ConvertersConfiguration.offsetDateTimeStructuredBindingEditor(); } - @Bean("offsetTimeConverter") - FormattedValueConverter offsetTimeConverter() { + @Bean + public FormattedValueConverter offsetTimeConverter() { return jsr310ConvertersConfiguration.offsetTimeConverter(); } - @Bean("offsetTimeValueConverter") - ValueConverter offsetTimeValueConverter() { + @Bean + public ValueConverter offsetTimeValueConverter() { return jsr310ConvertersConfiguration.offsetTimeValueConverter(); } - @Bean("offsetTimeStructuredBindingEditor") - TypedStructuredBindingEditor offsetTimeStructuredBindingEditor() { + @SuppressWarnings("rawtypes") + @Bean + public TypedStructuredBindingEditor offsetTimeStructuredBindingEditor() { return jsr310ConvertersConfiguration.offsetTimeStructuredBindingEditor(); } - @Bean("localDateTimeConverter") - FormattedValueConverter localDateTimeConverter() { + @Bean + public FormattedValueConverter localDateTimeConverter() { return jsr310ConvertersConfiguration.localDateTimeConverter(); } - @Bean("localDateTimeValueConverter") - ValueConverter localDateTimeValueConverter() { + @Bean + public ValueConverter localDateTimeValueConverter() { return jsr310ConvertersConfiguration.localDateTimeValueConverter(); } - @Bean("localDateTimeStructuredBindingEditor") - TypedStructuredBindingEditor localDateTimeStructuredBindingEditor() { + @SuppressWarnings("rawtypes") + @Bean + public TypedStructuredBindingEditor localDateTimeStructuredBindingEditor() { return jsr310ConvertersConfiguration.localDateTimeStructuredBindingEditor(); } - @Bean("localDateConverter") - FormattedValueConverter localDateConverter() { + @Bean + public FormattedValueConverter localDateConverter() { return jsr310ConvertersConfiguration.localDateConverter(); } - @Bean("localDateValueConverter") - ValueConverter localDateValueConverter() { + @Bean + public ValueConverter localDateValueConverter() { return jsr310ConvertersConfiguration.localDateValueConverter(); } - @Bean("localDateStructuredBindingEditor") - TypedStructuredBindingEditor localDateStructuredBindingEditor() { + @SuppressWarnings("rawtypes") + @Bean + public TypedStructuredBindingEditor localDateStructuredBindingEditor() { return jsr310ConvertersConfiguration.localDateStructuredBindingEditor(); } - @Bean("localTimeConverter") - FormattedValueConverter localTimeConverter() { + @Bean + public FormattedValueConverter localTimeConverter() { return jsr310ConvertersConfiguration.localTimeConverter(); } - @Bean("localTimeValueConverter") - ValueConverter localTimeValueConverter() { + @Bean + public ValueConverter localTimeValueConverter() { return jsr310ConvertersConfiguration.localTimeValueConverter(); } - @Bean("localTimeStructuredBindingEditor") - TypedStructuredBindingEditor localTimeStructuredBindingEditor() { + @SuppressWarnings("rawtypes") + @Bean + public TypedStructuredBindingEditor localTimeStructuredBindingEditor() { return jsr310ConvertersConfiguration.localTimeStructuredBindingEditor(); } - @Bean("zonedDateTimeConverter") - FormattedValueConverter zonedDateTimeConverter() { + @Bean + public FormattedValueConverter zonedDateTimeConverter() { return jsr310ConvertersConfiguration.zonedDateTimeConverter(); } - @Bean("zonedDateTimeValueConverter") - ValueConverter zonedDateTimeValueConverter() { + @Bean + public ValueConverter zonedDateTimeValueConverter() { return jsr310ConvertersConfiguration.zonedDateTimeValueConverter(); } - @Bean("zonedDateTimeStructuredBindingEditor") - TypedStructuredBindingEditor zonedDateTimeStructuredBindingEditor() { + @SuppressWarnings("rawtypes") + @Bean + public TypedStructuredBindingEditor zonedDateTimeStructuredBindingEditor() { return jsr310ConvertersConfiguration.zonedDateTimeStructuredBindingEditor(); } - @Bean("periodValueConverter") - ValueConverter periodValueConverter() { + @Bean + public ValueConverter periodValueConverter() { return jsr310ConvertersConfiguration.periodValueConverter(); } - @Bean("instantStringValueConverter") - ValueConverter instantStringValueConverter() { + @Bean + public ValueConverter instantStringValueConverter() { return jsr310ConvertersConfiguration.instantStringValueConverter(); } - @Bean("instantValueConverter") - ValueConverter instantValueConverter() { + @Bean + public ValueConverter instantValueConverter() { return jsr310ConvertersConfiguration.instantValueConverter(); } - @Bean("defaultUUIDConverter") - protected UUIDConverter defaultuuidConverter() { + @Bean + public UUIDConverter defaultUUIDConverter() { return new UUIDConverter(); } - @Bean("defaultGrailsBigIntegerConverter") - protected ValueConverter defaultGrailsBigIntegerConverter() { + @Bean + public ValueConverter defaultGrailsBigIntegerConverter() { LocaleAwareBigDecimalConverter converter = new LocaleAwareBigDecimalConverter(); converter.setTargetType(BigInteger.class); converter.setLocaleResolver(localResolver); return converter; } - @Bean("defaultDateConverter") - protected DateConversionHelper defaultDateConverter() { + @Bean + public DateConversionHelper defaultDateConverter() { DateConversionHelper converter = new DateConversionHelper(); converter.setDateParsingLenient(configurationProperties.isDateParsingLenient()); converter.setFormatStrings(configurationProperties.getDateFormats()); return converter; } - @Bean("timeZoneConverter") - protected TimeZoneConverter defaultTimeZoneConverter() { + @Bean + public TimeZoneConverter defaultTimeZoneConverter() { return new TimeZoneConverter(); } - @Bean("defaultShortConverter") - protected LocaleAwareNumberConverter shortConverter() { + @Bean + public LocaleAwareNumberConverter defaultShortConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(Short.class); return converter; } - @Bean("defaultshortConverter") - protected LocaleAwareNumberConverter primitiveShortConverter() { + @Bean + public LocaleAwareNumberConverter defaultshortConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(short.class); return converter; } - @Bean("defaultIntegerConverter") - protected LocaleAwareNumberConverter integerConverter() { + @Bean + public LocaleAwareNumberConverter defaultIntegerConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(Integer.class); return converter; } - @Bean("defaultintConverter") - protected LocaleAwareNumberConverter primitiveIntConverter() { + @Bean + public LocaleAwareNumberConverter defaultintConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(int.class); return converter; } - @Bean("defaultFloatConverter") - protected LocaleAwareNumberConverter floatConverter() { + @Bean + public LocaleAwareNumberConverter defaultFloatConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(Float.class); return converter; } - @Bean("defaultfloatConverter") - protected LocaleAwareNumberConverter primitiveFloattConverter() { + @Bean + public LocaleAwareNumberConverter defaultfloatConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(float.class); return converter; } - @Bean("defaultLongConverter") - protected LocaleAwareNumberConverter longConverter() { + @Bean + public LocaleAwareNumberConverter defaultLongConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(Long.class); return converter; } - @Bean("defaultlongConverter") - protected LocaleAwareNumberConverter primitiveLongConverter() { + @Bean + public LocaleAwareNumberConverter defaultlongConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(long.class); return converter; } - @Bean("defaultDoubleConverter") - protected LocaleAwareNumberConverter doubleConverter() { + @Bean + public LocaleAwareNumberConverter defaultDoubleConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(Double.class); return converter; } - @Bean("defaultdoubleConverter") - protected LocaleAwareNumberConverter primitiveDoubleConverter() { + @Bean + public LocaleAwareNumberConverter defaultdoubleConverter() { final LocaleAwareNumberConverter converter = new LocaleAwareNumberConverter(); converter.setLocaleResolver(localResolver); converter.setTargetType(double.class); diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy b/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy index fb3cd6ad0b..d7202265b5 100644 --- a/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy +++ b/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy @@ -1,17 +1,29 @@ +/* + * Copyright 2004-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.grails.databinding.converters; import grails.databinding.TypedStructuredBindingEditor import grails.databinding.converters.FormattedValueConverter import grails.databinding.converters.ValueConverter import org.grails.plugins.databinding.DataBindingConfigurationProperties -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import javax.inject.Inject import java.time.* import java.time.format.DateTimeFormatter -@Configuration class Jsr310ConvertersConfiguration { Set formatStrings = [] @@ -19,12 +31,10 @@ class Jsr310ConvertersConfiguration { Jsr310ConvertersConfiguration() { } - @Inject Jsr310ConvertersConfiguration(DataBindingConfigurationProperties configurationProperties) { this.formatStrings = configurationProperties.dateFormats as Set } - @Bean FormattedValueConverter offsetDateTimeConverter() { new FormattedValueConverter() { @Override @@ -39,7 +49,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter offsetDateTimeValueConverter() { new Jsr310DateValueConverter() { @Override @@ -56,7 +65,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean TypedStructuredBindingEditor offsetDateTimeStructuredBindingEditor() { new CustomDateBindingEditor() { @Override @@ -71,7 +79,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean FormattedValueConverter offsetTimeConverter() { new FormattedValueConverter() { @Override @@ -86,7 +93,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter offsetTimeValueConverter() { new Jsr310DateValueConverter() { @Override @@ -103,7 +109,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean TypedStructuredBindingEditor offsetTimeStructuredBindingEditor() { new CustomDateBindingEditor() { @Override @@ -118,7 +123,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean FormattedValueConverter localDateTimeConverter() { new FormattedValueConverter() { @Override @@ -133,7 +137,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter localDateTimeValueConverter() { new Jsr310DateValueConverter() { @Override @@ -150,7 +153,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean TypedStructuredBindingEditor localDateTimeStructuredBindingEditor() { new CustomDateBindingEditor() { @Override @@ -165,7 +167,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean FormattedValueConverter localDateConverter() { new FormattedValueConverter() { @Override @@ -180,7 +181,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter localDateValueConverter() { new Jsr310DateValueConverter() { @Override @@ -197,7 +197,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean TypedStructuredBindingEditor localDateStructuredBindingEditor() { new CustomDateBindingEditor() { @Override @@ -212,7 +211,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean FormattedValueConverter localTimeConverter() { new FormattedValueConverter() { @Override @@ -227,7 +225,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter localTimeValueConverter() { new Jsr310DateValueConverter() { @Override @@ -244,7 +241,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean TypedStructuredBindingEditor localTimeStructuredBindingEditor() { new CustomDateBindingEditor() { @Override @@ -259,7 +255,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean FormattedValueConverter zonedDateTimeConverter() { new FormattedValueConverter() { @Override @@ -274,7 +269,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter zonedDateTimeValueConverter() { new Jsr310DateValueConverter() { @Override @@ -291,7 +285,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean TypedStructuredBindingEditor zonedDateTimeStructuredBindingEditor() { new CustomDateBindingEditor() { @Override @@ -306,7 +299,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter periodValueConverter() { new Jsr310DateValueConverter() { @Override @@ -321,7 +313,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter instantStringValueConverter() { new ValueConverter() { @Override @@ -340,7 +331,6 @@ class Jsr310ConvertersConfiguration { } } - @Bean ValueConverter instantValueConverter() { new ValueConverter() { @Override diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy b/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy index a6b2d43bf8..772700ed3d 100644 --- a/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy +++ b/grails-plugin-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2013 the original author or authors. + * Copyright 2013-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package org.grails.databinding.converters.web import grails.databinding.converters.ValueConverter; import groovy.transform.CompileStatic -import javax.inject.Singleton import java.text.NumberFormat import java.text.ParsePosition diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy index 78e7ff38bd..07cd70e29c 100644 --- a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy +++ b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy @@ -33,7 +33,6 @@ import org.grails.databinding.converters.DateConversionHelper import org.grails.databinding.converters.TimeZoneConverter import org.grails.databinding.converters.web.LocaleAwareBigDecimalConverter import org.grails.databinding.converters.web.LocaleAwareNumberConverter -import org.springframework.util.ClassUtils /** * Plugin for configuring the data binding features of Grails @@ -50,9 +49,16 @@ abstract class AbstractDataBindingGrailsPlugin extends Plugin { public static final String DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss" public static final String DEFAULT_JSR310_LOCAL_DATE_FORMAT = "yyyy-MM-dd" public static final String DEFAULT_JSR310_LOCAL_TIME_FORMAT = "HH:mm:ss" - public static final List DEFAULT_DATE_FORMATS = ['yyyy-MM-dd HH:mm:ss.S',"yyyy-MM-dd'T'HH:mm:ss'Z'","yyyy-MM-dd HH:mm:ss.S z","yyyy-MM-dd'T'HH:mm:ss.SSSX", DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT, DEFAULT_JSR310_OFFSET_TIME_FORMAT, DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT, DEFAULT_JSR310_LOCAL_DATE_FORMAT, DEFAULT_JSR310_LOCAL_TIME_FORMAT] - - boolean enabled = !ClassUtils.isPresent("io.micronaut.spring.context.env.MicronautEnvironment", getClass().getClassLoader()) + public static final List DEFAULT_DATE_FORMATS = [ + 'yyyy-MM-dd HH:mm:ss.S', + "yyyy-MM-dd'T'HH:mm:ss'Z'", + "yyyy-MM-dd HH:mm:ss.S z", + "yyyy-MM-dd'T'HH:mm:ss.SSSX", + DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT, + DEFAULT_JSR310_OFFSET_TIME_FORMAT, + DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT, + DEFAULT_JSR310_LOCAL_DATE_FORMAT, + DEFAULT_JSR310_LOCAL_TIME_FORMAT] @Override Closure doWithSpring() {{-> @@ -64,7 +70,6 @@ abstract class AbstractDataBindingGrailsPlugin extends Plugin { Integer autoGrowCollectionLimitSetting = config.getProperty(Settings.AUTO_GROW_COLLECTION_LIMIT, Integer, 256) List dateFormats = config.getProperty(Settings.DATE_FORMATS, List, DEFAULT_DATE_FORMATS) - "${DataBindingUtils.DATA_BINDER_BEAN_NAME}"(GrailsWebDataBinder, grailsApplication) { // trimStrings defaults to TRUE trimStrings = trimStringsSetting diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java index 25c1e6a3b7..f39f1eb6e6 100644 --- a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java +++ b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java @@ -1,3 +1,19 @@ +/* + * Copyright 2004-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.grails.plugins.databinding; import grails.core.GrailsApplication; @@ -6,16 +22,30 @@ import grails.databinding.converters.ValueConverter; import grails.databinding.events.DataBindingListener; import grails.web.databinding.GrailsWebDataBinder; -import io.micronaut.core.util.ArrayUtils; import org.grails.databinding.bindingsource.DataBindingSourceCreator; +import org.grails.databinding.converters.DefaultConvertersConfiguration; import org.grails.web.databinding.bindingsource.*; -import org.springframework.context.ApplicationContext; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.AnnotationAwareOrderComparator; -@Configuration +/** + * Plugin for configuring the data binding features of Grails + * + * @author Graeme Rocher + * @author Michael Yan + * + * @since 2022.0.0 + */ +@Configuration(proxyBeanMethods = false) +@AutoConfigureOrder +@EnableConfigurationProperties(DataBindingConfigurationProperties.class) +@ImportAutoConfiguration(DefaultConvertersConfiguration.class) public class DataBindingConfiguration { private final DataBindingConfigurationProperties configurationProperties; @@ -24,65 +54,68 @@ public DataBindingConfiguration(DataBindingConfigurationProperties configuration this.configurationProperties = configurationProperties; } - @Bean("grailsWebDataBinder") - protected GrailsWebDataBinder grailsWebDataBinder( - GrailsApplication grailsApplication, - ValueConverter[] valueConverters, - FormattedValueConverter[] formattedValueConverters, - TypedStructuredBindingEditor[] structuredBindingEditors, - DataBindingListener[] dataBindingListeners) { + @SuppressWarnings("rawtypes") + @Bean + public GrailsWebDataBinder grailsWebDataBinder( + ObjectProvider grailsApplication, + ObjectProvider valueConverters, + ObjectProvider formattedValueConverters, + ObjectProvider structuredBindingEditors, + ObjectProvider dataBindingListeners, + ObjectProvider messageSource) { - GrailsWebDataBinder dataBinder = new GrailsWebDataBinder(grailsApplication); + GrailsWebDataBinder dataBinder = new GrailsWebDataBinder(grailsApplication.getIfAvailable()); dataBinder.setConvertEmptyStringsToNull(configurationProperties.isConvertEmptyStringsToNull()); dataBinder.setTrimStrings(configurationProperties.isTrimStrings()); dataBinder.setAutoGrowCollectionLimit(configurationProperties.getAutoGrowCollectionLimit()); - final ApplicationContext mainContext = grailsApplication.getMainContext(); - final ValueConverter[] mainContextConverters = mainContext - .getBeansOfType(ValueConverter.class).values().toArray(new ValueConverter[0]); - final ValueConverter[] allValueConverters = ArrayUtils.concat(valueConverters, mainContextConverters); - AnnotationAwareOrderComparator.sort(allValueConverters); - dataBinder.setValueConverters(allValueConverters); - - final FormattedValueConverter[] mainContextFormattedValueConverters = mainContext - .getBeansOfType(FormattedValueConverter.class).values().toArray(new FormattedValueConverter[0]); - dataBinder.setFormattedValueConverters(ArrayUtils.concat(formattedValueConverters, mainContextFormattedValueConverters)); - final TypedStructuredBindingEditor[] mainContextStructuredBindingEditors = mainContext - .getBeansOfType(TypedStructuredBindingEditor.class).values().toArray(new TypedStructuredBindingEditor[0]); - dataBinder.setStructuredBindingEditors(ArrayUtils.concat(structuredBindingEditors, mainContextStructuredBindingEditors)); - final DataBindingListener[] mainContextDataBindingListeners = mainContext - .getBeansOfType(DataBindingListener.class).values().toArray(new DataBindingListener[0]); - dataBinder.setDataBindingListeners(ArrayUtils.concat(dataBindingListeners,mainContextDataBindingListeners)); - dataBinder.setMessageSource(mainContext.getBean("messageSource", MessageSource.class)); + + ValueConverter[] defaultValueConverters = valueConverters.orderedStream().toArray(ValueConverter[]::new); + AnnotationAwareOrderComparator.sort(defaultValueConverters); + dataBinder.setValueConverters(defaultValueConverters); + + FormattedValueConverter[] defaultFormattedValueConverters = formattedValueConverters.orderedStream() + .toArray(FormattedValueConverter[]::new); + dataBinder.setFormattedValueConverters(defaultFormattedValueConverters); + + TypedStructuredBindingEditor[] defaultStructuredBindingEditors = structuredBindingEditors.orderedStream() + .toArray(TypedStructuredBindingEditor[]::new); + dataBinder.setStructuredBindingEditors(defaultStructuredBindingEditors); + + DataBindingListener[] defaultDataBindingListeners = dataBindingListeners.orderedStream() + .toArray(DataBindingListener[]::new); + dataBinder.setDataBindingListeners(defaultDataBindingListeners); + + dataBinder.setMessageSource(messageSource.getIfAvailable()); return dataBinder; } - @Bean("xmlDataBindingSourceCreator") - protected XmlDataBindingSourceCreator xmlDataBindingSourceCreator() { + @Bean + public XmlDataBindingSourceCreator xmlDataBindingSourceCreator() { return new XmlDataBindingSourceCreator(); } - @Bean("jsonDataBindingSourceCreator") - protected JsonDataBindingSourceCreator jsonDataBindingSourceCreator() { + @Bean + public JsonDataBindingSourceCreator jsonDataBindingSourceCreator() { return new JsonDataBindingSourceCreator(); } - @Bean("halJsonDataBindingSourceCreator") - protected HalJsonDataBindingSourceCreator halJsonDataBindingSourceCreator() { + @Bean + public HalJsonDataBindingSourceCreator halJsonDataBindingSourceCreator() { return new HalJsonDataBindingSourceCreator(); } - @Bean("halXmlDataBindingSourceCreator") - protected HalXmlDataBindingSourceCreator halXmlDataBindingSourceCreator() { + @Bean + public HalXmlDataBindingSourceCreator halXmlDataBindingSourceCreator() { return new HalXmlDataBindingSourceCreator(); } - @Bean("jsonApiDataBindingSourceCreator") - protected JsonApiDataBindingSourceCreator jsonApiDataBindingSourceCreator() { + @Bean + public JsonApiDataBindingSourceCreator jsonApiDataBindingSourceCreator() { return new JsonApiDataBindingSourceCreator(); } - @Bean("dataBindingSourceRegistry") - protected DataBindingSourceRegistry dataBindingSourceRegistry(DataBindingSourceCreator... creators) { + @Bean + public DataBindingSourceRegistry dataBindingSourceRegistry(DataBindingSourceCreator... creators) { final DefaultDataBindingSourceRegistry registry = new DefaultDataBindingSourceRegistry(); registry.setDataBindingSourceCreators(creators); registry.initialize(); diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.groovy b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.groovy deleted file mode 100644 index 68e4ff44ab..0000000000 --- a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package org.grails.plugins.databinding - -import grails.util.GrailsUtil - -/** - * Keep this plugin when not using micronaut, - * Use {@link DataBindingConfiguration} instead when using micronaut - */ -class DataBindingGrailsPlugin extends AbstractDataBindingGrailsPlugin { - - def version = GrailsUtil.getGrailsVersion() - - @Override - Closure doWithSpring() { - return super.doWithSpring() - } -} diff --git a/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.java b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.java new file mode 100644 index 0000000000..e2049d88fc --- /dev/null +++ b/grails-plugin-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.java @@ -0,0 +1,14 @@ +package org.grails.plugins.databinding; + +import groovy.lang.Closure; + +/** + * @deprecated as of 2022.0.0; use {@link DataBindingConfiguration} instead + */ +class DataBindingGrailsPlugin extends AbstractDataBindingGrailsPlugin { + + @Override + public Closure doWithSpring() { + return super.doWithSpring(); + } +} diff --git a/grails-plugin-databinding/src/main/resources/META-INF/spring.factories b/grails-plugin-databinding/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..fce9717edf --- /dev/null +++ b/grails-plugin-databinding/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configure +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.grails.plugins.databinding.DataBindingConfiguration \ No newline at end of file diff --git a/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/DataBindingConfigurationSpec.groovy b/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/DataBindingConfigurationSpec.groovy index ea85ffa447..329a501e2e 100644 --- a/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/DataBindingConfigurationSpec.groovy +++ b/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/DataBindingConfigurationSpec.groovy @@ -16,7 +16,10 @@ class DataBindingConfigurationSpec extends Specification implements GrailsUnitTe void setup() { - defineBeans { + } + + Closure doWithSpring() { + { -> myValueConverter1(MyValueConverter) myValueConverter2(MyValueConverter2) myDateValueConverter(MyDateValueConverter) diff --git a/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/GroovyConfigPropertySourceLoaderSpec.groovy b/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/GroovyConfigPropertySourceLoaderSpec.groovy index 5484b3bab8..71fa8fd132 100644 --- a/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/GroovyConfigPropertySourceLoaderSpec.groovy +++ b/grails-plugin-databinding/src/test/groovy/org/grails/plugins/databinding/GroovyConfigPropertySourceLoaderSpec.groovy @@ -10,6 +10,6 @@ class GroovyConfigPropertySourceLoaderSpec extends Specification implements Grai void "test read config from application.groovy from parent Micronaut context"() { expect: - ((ConfigurableApplicationContext) applicationContext.parent).getEnvironment().getProperty("foo", String) == "bar" + ((ConfigurableApplicationContext) applicationContext).getEnvironment().getProperty("foo", String) == "bar" } } diff --git a/grails-web-databinding/src/main/groovy/grails/web/databinding/GrailsWebDataBinder.groovy b/grails-web-databinding/src/main/groovy/grails/web/databinding/GrailsWebDataBinder.groovy index 92df2a8dbb..50c15ab968 100644 --- a/grails-web-databinding/src/main/groovy/grails/web/databinding/GrailsWebDataBinder.groovy +++ b/grails-web-databinding/src/main/groovy/grails/web/databinding/GrailsWebDataBinder.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import grails.databinding.* import grails.databinding.converters.FormattedValueConverter import grails.databinding.converters.ValueConverter import grails.databinding.events.DataBindingListener -import grails.util.Environment import grails.util.GrailsClassUtils import grails.util.GrailsMetaClassUtils import grails.util.GrailsNameUtils @@ -46,12 +45,10 @@ import org.grails.datastore.mapping.model.types.OneToMany import org.grails.datastore.mapping.model.types.OneToOne import org.grails.datastore.mapping.model.types.Simple import org.grails.web.databinding.DataBindingEventMulticastListener -import org.grails.web.databinding.DefaultASTDatabindingHelper import org.grails.web.databinding.GrailsWebDataBindingListener import org.grails.web.databinding.SpringConversionServiceAdapter import org.grails.web.databinding.converters.ByteArrayMultipartFileValueConverter import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.MessageSource import org.springframework.validation.BeanPropertyBindingResult import org.springframework.validation.BindingResult @@ -59,8 +56,6 @@ import org.springframework.validation.FieldError import org.springframework.validation.ObjectError import java.lang.annotation.Annotation -import java.lang.reflect.Modifier -import java.util.concurrent.ConcurrentHashMap import static grails.web.databinding.DataBindingUtils.* @@ -606,28 +601,24 @@ class GrailsWebDataBinder extends SimpleDataBinder { addElementToCollection obj, propName, property.type, propertyValue, clearCollection } - @Autowired(required=false) void setStructuredBindingEditors(TypedStructuredBindingEditor[] editors) { editors.each { TypedStructuredBindingEditor editor -> registerStructuredEditor editor.targetType, editor } } - @Autowired(required=false) void setValueConverters(ValueConverter[] converters) { converters.each { ValueConverter converter -> registerConverter converter } } - @Autowired(required=false) void setFormattedValueConverters(FormattedValueConverter[] converters) { converters.each { FormattedValueConverter converter -> registerFormattedValueConverter converter } } - @Autowired(required=false) void setDataBindingListeners(DataBindingListener[] listeners) { this.listeners.addAll Arrays.asList(listeners) } @@ -644,7 +635,6 @@ class GrailsWebDataBinder extends SimpleDataBinder { persistentInstance ?: super.convert(typeToConvertTo, value) } - @Autowired void setMessageSource(MessageSource messageSource) { this.messageSource = messageSource }