Data binding Grails绑定集合枚举

Data binding Grails绑定集合枚举,data-binding,grails,spring-mvc,groovy,enums,Data Binding,Grails,Spring Mvc,Groovy,Enums,在我的grails应用程序中,我有以下枚举: public enum RelationshipStatus{ Single_Never_Married, Separated, Divorced, Widowed; } 我已定义此命令对象: class MyCommand { List<RelationshipStatus> relationshipStatuses } 当我使用参数提交对此操作的请求时 user.relationshipStatuse

在我的grails应用程序中,我有以下枚举:

public enum RelationshipStatus{

  Single_Never_Married, 
  Separated,
  Divorced, 
  Widowed;  
}
我已定义此命令对象:

class MyCommand {
  List<RelationshipStatus> relationshipStatuses
}
当我使用参数提交对此操作的请求时

user.relationshipStatuses=Separated&user.relationshipStatuses=Divorced
我希望
myCommand.RelationshipStatus
将包含
RelationshipStatus.Separated
RelationshipStatus.Dissected
,但实际上它是空的

我的理解是Grails根据枚举的名称自动执行请求参数->枚举转换。如果没有,我尝试定义一个属性编辑器来进行此转换:

class RelationshipStatusEnumEditor extends PropertyEditorSupport {    

    public String getAsText() {
        value.name()
    }

    public void setAsText(String text) {
        RelationshipStatus.valueOf(text)
    }
}

我向Grails/Spring注册了这个编辑器,并重试了一次,但结果是一样的。是否可以将请求参数绑定到Enum的集合?

因为我知道grails在默认情况下不会填充列表属性,如果它是空的。仅当它已经存在并且传递了项的索引时

尝试将此属性定义为:

import org.apache.commons.collections.ListUtils
import org.apache.commons.collections.Factory

class MyCommand {
    List<RelationshipStatus> relationshipStatuses = ListUtils.lazyList([],{new RelationshipStatus()} as Factory)
}

使用Grails2.3中引入的databinder,我提出了以下将请求参数转换为枚举集合的解决方案。例如,给定这些枚举

enum Gender {
    MALE, FEMALE
}

enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}
还有这个命令对象

class MyCommand {
    Collection<Gender> genders
    Collection<Season> seasons
}
然后在
resources.groovy
中将
EnumCollectionConverter
注册为Springbean,不管您为bean选择什么名称。然后,要使用上面的类将逗号分隔的字符串转换为num集合,请使用

class MyCommand {
    @BindingFormat('Gender')
    Collection<Gender> genders

    @BindingFormat('Season')
    Collection<Season> seasons
}
类MyCommand{
@BindingFormat('性别')
收集性别
@BindingFormat('季节')
收集季节
}

传递给
@BindingFormat
的值应该是将存储在绑定集合中的枚举类型的简单名称。

我认为,Grails不知道如何填充列表,因为它会丢弃列表类型(list)上的信息。我不确定,如果可能的话。
class MyCommand {
    Collection<Gender> genders
    Collection<Season> seasons
}
class EnumCollectionConverter implements FormattedValueConverter {

   /**
    * To make other enums bindable, just add them to this list
    */
    private static final List<Class<Enum>> convertableEnums = [Gender, Season]

    @Override
    Object convert(value, String format) {

        Class<Enum> targetEnumClass = convertableEnums.find { it.simpleName == format }

        if (targetEnumClass) {
            List<String> enumConstantNames = value.toString().tokenize(',')
            return enumConstantNames.collect { targetEnumClass.valueOf(it) }
        }
        value
    }

    @Override
    Class<?> getTargetType() {

        // this class converts to a Collection<T extends Enum<T>> but the return value 
        // of this method can't be any more specific than Collection due to type erasure
        Collection
    }
}
class MyCommand {
    @BindingFormat('Gender')
    Collection<Gender> genders

    @BindingFormat('Season')
    Collection<Season> seasons
}