From e7b8fce3fde85f981800aa607e05eca9f3bd38bc Mon Sep 17 00:00:00 2001 From: Joe McCall Date: Mon, 4 Feb 2019 17:47:46 -0500 Subject: [PATCH] Convert bound data when added to collections Fixes #11235 --- .../databinding/SimpleDataBinder.groovy | 2 + .../databinding/SimpleDataBinderSpec.groovy | 46 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/grails-databinding/src/main/groovy/grails/databinding/SimpleDataBinder.groovy b/grails-databinding/src/main/groovy/grails/databinding/SimpleDataBinder.groovy index fd919670077..f57a708c445 100755 --- a/grails-databinding/src/main/groovy/grails/databinding/SimpleDataBinder.groovy +++ b/grails-databinding/src/main/groovy/grails/databinding/SimpleDataBinder.groovy @@ -344,6 +344,8 @@ class SimpleDataBinder implements DataBinder { } else if(genericType.isEnum() && val instanceof CharSequence) { def enumValue = convertStringToEnum(genericType, val.toString()) addElementToCollectionAt obj, propName, collectionInstance, index, enumValue + } else { + addElementToCollectionAt obj, propName, collectionInstance, index, convert(genericType, val) } } else { addElementToCollectionAt obj, propName, collectionInstance, index, val diff --git a/grails-databinding/src/test/groovy/grails/databinding/SimpleDataBinderSpec.groovy b/grails-databinding/src/test/groovy/grails/databinding/SimpleDataBinderSpec.groovy index 2be5aba9526..8ed2d32b47c 100755 --- a/grails-databinding/src/test/groovy/grails/databinding/SimpleDataBinderSpec.groovy +++ b/grails-databinding/src/test/groovy/grails/databinding/SimpleDataBinderSpec.groovy @@ -14,7 +14,7 @@ */ package grails.databinding - +import grails.databinding.converters.ValueConverter import grails.databinding.errors.BindingError import grails.databinding.events.DataBindingListenerAdapter import org.grails.databinding.converters.DateConversionHelper @@ -574,6 +574,42 @@ class SimpleDataBinderSpec extends Specification { widget.listOfLongs == [4L] widget.listOfLongs.first().getClass() == Long } + + @Issue('https://github.com/grails/grails-core/issues/11235') + void 'Test binding to a list using custom value converters'() { + given: + def binder = new SimpleDataBinder() + def comment = new Comment() + + and: + binder.registerConverter(new ValueConverter() { + @Override + boolean canConvert(Object value) { + value instanceof String + } + + @Override + Object convert(Object value) { + new Attachment(filename: "$value") + } + + @Override + Class getTargetType() { + return Attachment + } + }) + + when: + binder.bind comment, [ + 'attachments[0]': 'foo.txt', + 'attachments[1]': 'bar.txt' + ] as SimpleMapDataBindingSource + + then: + comment.attachments.size() == 2 + comment.attachments.find { it.filename == 'foo.txt' } + comment.attachments.find { it.filename == 'bar.txt' } + } } class Factory { @@ -642,3 +678,11 @@ class DateCollection { List dates } +class Comment { + Set attachments +} + +class Attachment { + String filename +} +