This is an automated email from the ASF dual-hosted git repository. matrei pushed a commit to branch matrei/register-databinding-plugin in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 1b6a967860caf2c84bd0996df9dfd8b940a10461 Author: Mattias Reichel <[email protected]> AuthorDate: Thu Mar 19 16:00:01 2026 +0100 fix: register data binding plugin The data binding plugin was no longer registered as a plugin since it became a Spring AutoConfiguration. --- .../AbstractDataBindingGrailsPlugin.groovy | 121 --------------------- .../DataBindingConfigurationProperties.java | 18 ++- .../databinding/DataBindingGrailsPlugin.groovy | 36 ++++++ .../Jsr310ConvertersConfigurationSpec.groovy | 32 ++++-- 4 files changed, 77 insertions(+), 130 deletions(-) diff --git a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy deleted file mode 100644 index 30caf8383a..0000000000 --- a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 - * - * https://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.config.Settings -import grails.plugins.Plugin -import grails.util.GrailsUtil -import grails.web.databinding.DataBindingUtils -import grails.web.databinding.GrailsWebDataBinder -import org.grails.databinding.converters.CurrencyValueConverter -import org.grails.databinding.converters.DateConversionHelper -import org.grails.databinding.converters.Jsr310ConvertersConfiguration -import org.grails.databinding.converters.TimeZoneConverter -import org.grails.databinding.converters.UUIDConverter -import org.grails.databinding.converters.web.LocaleAwareBigDecimalConverter -import org.grails.databinding.converters.web.LocaleAwareNumberConverter -import org.grails.web.databinding.bindingsource.DataBindingSourceRegistry -import org.grails.web.databinding.bindingsource.DefaultDataBindingSourceRegistry -import org.grails.web.databinding.bindingsource.HalJsonDataBindingSourceCreator -import org.grails.web.databinding.bindingsource.HalXmlDataBindingSourceCreator -import org.grails.web.databinding.bindingsource.JsonApiDataBindingSourceCreator -import org.grails.web.databinding.bindingsource.JsonDataBindingSourceCreator -import org.grails.web.databinding.bindingsource.XmlDataBindingSourceCreator - -/** - * Plugin for configuring the data binding features of Grails - * - * @author Jeff Brown - * @author Graeme Rocher - * - * @since 2.3 - */ -abstract class AbstractDataBindingGrailsPlugin extends Plugin { - - public static final String DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ" - public static final String DEFAULT_JSR310_OFFSET_TIME_FORMAT = 'HH:mm:ssZ' - 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<String> 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] - - def version = GrailsUtil.getGrailsVersion() - - @Override - Closure doWithSpring() { - { -> - def application = grailsApplication - def config = application.config - boolean trimStringsSetting = config.getProperty(Settings.TRIM_STRINGS, Boolean, true) - boolean convertEmptyStringsToNullSetting = config.getProperty(Settings.CONVERT_EMPTY_STRINGS_TO_NULL, Boolean, true) - boolean dateParsingLenientSetting = config.getProperty(Settings.DATE_LENIENT_PARSING, Boolean, false) - 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 - // convertEmptyStringsToNull defaults to TRUE - convertEmptyStringsToNull = convertEmptyStringsToNullSetting - // autoGrowCollectionLimit defaults to 256 - autoGrowCollectionLimit = autoGrowCollectionLimitSetting - } - - dataBindingConfigurationProperties(DataBindingConfigurationProperties) - timeZoneConverter(TimeZoneConverter) - uuidConverter(UUIDConverter) - - defaultDateConverter(DateConversionHelper) { - formatStrings = dateFormats - // dateParsingLenient defaults to false - dateParsingLenient = dateParsingLenientSetting - } - [Short, Short.TYPE, - Integer, Integer.TYPE, - Float, Float.TYPE, - Long, Long.TYPE, - Double, Double.TYPE].each { numberType -> - "defaultGrails${numberType.simpleName}Converter"(LocaleAwareNumberConverter) { - targetType = numberType - } - } - defaultGrailsBigDecimalConverter(LocaleAwareBigDecimalConverter) { - targetType = BigDecimal - } - defaultGrailsBigIntegerConverter(LocaleAwareBigDecimalConverter) { - targetType = BigInteger - } - - jsr310DataBinding(Jsr310ConvertersConfiguration) { - formatStrings = dateFormats - } - - "${DataBindingSourceRegistry.BEAN_NAME}"(DefaultDataBindingSourceRegistry) - - xmlDataBindingSourceCreator(XmlDataBindingSourceCreator) - jsonDataBindingSourceCreator(JsonDataBindingSourceCreator) - halJsonDataBindingSourceCreator(HalJsonDataBindingSourceCreator) - halXmlDataBindingSourceCreator(HalXmlDataBindingSourceCreator) - jsonApiDataBindingSourceCreator(JsonApiDataBindingSourceCreator) - - defaultCurrencyConverter(CurrencyValueConverter) - } - } - -} diff --git a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java index f152c0b211..3c1838bd9b 100644 --- a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java +++ b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java @@ -31,11 +31,27 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("grails.databinding") public class DataBindingConfigurationProperties { + private static final String DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; + private static final String DEFAULT_JSR310_OFFSET_TIME_FORMAT = "HH:mm:ssZ"; + private static final String DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; + private static final String DEFAULT_JSR310_LOCAL_DATE_FORMAT = "yyyy-MM-dd"; + private static final String DEFAULT_JSR310_LOCAL_TIME_FORMAT = "HH:mm:ss"; + private boolean trimStrings = true; private boolean convertEmptyStringsToNull = true; private int autoGrowCollectionLimit = 256; private boolean dateParsingLenient = false; - private List<String> dateFormats = AbstractDataBindingGrailsPlugin.DEFAULT_DATE_FORMATS; + private List<String> dateFormats = List.of( + "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 + ); public boolean isTrimStrings() { return trimStrings; diff --git a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.groovy b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.groovy new file mode 100644 index 0000000000..6d353b26ea --- /dev/null +++ b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingGrailsPlugin.groovy @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * https://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.plugins.Plugin +import grails.util.GrailsUtil + +/** + * Plugin for configuring the data binding features of Grails + * + * @author Jeff Brown + * @author Graeme Rocher + * + * @since 2.3 + */ +class DataBindingGrailsPlugin extends Plugin { + + def version = GrailsUtil.getGrailsVersion() +} diff --git a/grails-databinding/src/test/groovy/org/grails/databinding/converters/Jsr310ConvertersConfigurationSpec.groovy b/grails-databinding/src/test/groovy/org/grails/databinding/converters/Jsr310ConvertersConfigurationSpec.groovy index 30e836335d..6846583c6a 100644 --- a/grails-databinding/src/test/groovy/org/grails/databinding/converters/Jsr310ConvertersConfigurationSpec.groovy +++ b/grails-databinding/src/test/groovy/org/grails/databinding/converters/Jsr310ConvertersConfigurationSpec.groovy @@ -18,7 +18,6 @@ */ package org.grails.databinding.converters -import org.grails.plugins.databinding.AbstractDataBindingGrailsPlugin import spock.lang.Shared import spock.lang.Specification @@ -26,8 +25,25 @@ import java.time.* class Jsr310ConvertersConfigurationSpec extends Specification { + private static final String DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ" + private static final String DEFAULT_JSR310_OFFSET_TIME_FORMAT = 'HH:mm:ssZ' + private static final String DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss" + private static final String DEFAULT_JSR310_LOCAL_DATE_FORMAT = 'yyyy-MM-dd' + private static final String DEFAULT_JSR310_LOCAL_TIME_FORMAT = 'HH:mm:ss' + private static final List<String> 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 + ] + @Shared - Jsr310ConvertersConfiguration config = new Jsr310ConvertersConfiguration(formatStrings: AbstractDataBindingGrailsPlugin.DEFAULT_DATE_FORMATS) + Jsr310ConvertersConfiguration config = new Jsr310ConvertersConfiguration(formatStrings: DEFAULT_DATE_FORMATS) @Shared Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) @@ -42,7 +58,7 @@ class Jsr310ConvertersConfigurationSpec extends Specification { expect: converter.targetType == LocalDateTime - converter.convert("1941-01-05T08:00:00", AbstractDataBindingGrailsPlugin.DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT) instanceof LocalDateTime + converter.convert("1941-01-05T08:00:00", DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT) instanceof LocalDateTime } void "localDateTimeValueConverter"() { @@ -75,7 +91,7 @@ class Jsr310ConvertersConfigurationSpec extends Specification { expect: converter.targetType == LocalDate - converter.convert("1941-01-05", AbstractDataBindingGrailsPlugin.DEFAULT_JSR310_LOCAL_DATE_FORMAT) instanceof LocalDate + converter.convert("1941-01-05", DEFAULT_JSR310_LOCAL_DATE_FORMAT) instanceof LocalDate } void "localDateValueConverter"() { @@ -105,7 +121,7 @@ class Jsr310ConvertersConfigurationSpec extends Specification { expect: converter.targetType == LocalTime - converter.convert("08:00:00", AbstractDataBindingGrailsPlugin.DEFAULT_JSR310_LOCAL_TIME_FORMAT) instanceof LocalTime + converter.convert("08:00:00", DEFAULT_JSR310_LOCAL_TIME_FORMAT) instanceof LocalTime } void "localTimeValueConverter"() { @@ -135,7 +151,7 @@ class Jsr310ConvertersConfigurationSpec extends Specification { expect: converter.targetType == OffsetTime - converter.convert("08:00:00+0000", AbstractDataBindingGrailsPlugin.DEFAULT_JSR310_OFFSET_TIME_FORMAT) instanceof OffsetTime + converter.convert("08:00:00+0000", DEFAULT_JSR310_OFFSET_TIME_FORMAT) instanceof OffsetTime } void "offsetTimeValueConverter"() { @@ -165,7 +181,7 @@ class Jsr310ConvertersConfigurationSpec extends Specification { expect: converter.targetType == OffsetDateTime - converter.convert("1941-01-05T08:00:00+0000", AbstractDataBindingGrailsPlugin.DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT) instanceof OffsetDateTime + converter.convert("1941-01-05T08:00:00+0000", DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT) instanceof OffsetDateTime } void "offsetDateTimeValueConverter"() { @@ -198,7 +214,7 @@ class Jsr310ConvertersConfigurationSpec extends Specification { expect: converter.targetType == ZonedDateTime - converter.convert("1941-01-05T08:00:00+0000", AbstractDataBindingGrailsPlugin.DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT) instanceof ZonedDateTime + converter.convert("1941-01-05T08:00:00+0000", DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT) instanceof ZonedDateTime } void "zonedDateTimeValueConverter"() {
