data-binding - Grails 绑定(bind)集合枚举

在我的 grails 应用程序中,我有这个枚举:

public enum RelationshipStatus{

  Single_Never_Married, 
  Separated,
  Divorced, 
  Widowed;  
}

我已经定义了这个命令对象:
class MyCommand {
  List<RelationshipStatus> relationshipStatuses
}

我在我的 Controller 操作之一中使用
def myAction = {MyCommand myCommand ->
}

当我使用参数向此操作提交请求时
user.relationshipStatuses=Separated&user.relationshipStatuses=Divorced

我希望 myCommand.relationshipStatuses将包含 RelationshipStatus.SeparatedRelationshipStatus.Divorced ,但实际上它是空的。

我的理解是Grails会根据枚举的名字自动执行请求参数->枚举转换。只是它没有,我尝试定义一个执行此转换的属性编辑器:
class RelationshipStatusEnumEditor extends PropertyEditorSupport {    

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

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

我用 Grails/Spring 注册了这个编辑器,然后又试了一次,结果还是一样。是否可以将请求参数绑定(bind)到 收藏 枚举?

最佳答案

使用 Grails 2.3 中引入的数据绑定(bind)器,我想出了以下将请求参数转换为枚举集合的解决方案。例如,给定这些枚举

enum Gender {
    MALE, FEMALE
}

enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

和这个命令对象
class MyCommand {
    Collection<Gender> genders
    Collection<Season> seasons
}

并假设我们想要转换像 "MALE,FEMALE" 这样的字符串和 "SPRING,SUMMER,WINTER"到相应的枚举集合。首先,提供 FormattedValueConverter 的实现进行转换
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
    }
}

然后注册EnumCollectionConverter作为 resources.groovy 中的 Spring bean - 为 bean 选择什么名称并不重要。然后要使用上面的类将逗号分隔的字符串转换为 num 集合,请使用注释相关属性
class MyCommand {
    @BindingFormat('Gender')
    Collection<Gender> genders

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

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

https://stackoverflow.com/questions/7216297/

相关文章:

grails - 使用类为M:M关系建模时,Grails 2.0在Bootstrap中服务于不同的行

grails - 将Grails 1.3.7与EclipseLink 2.2.0 JPA Provi

grails - 为什么Save无法在Grails中使用模拟域?

grails - 同一页上有多个表和可排序列的问题

grails - 在Grails的Jasper中将集合用作参数

jakarta-ee - 将Grails应用程序作为一个war文件部署在另一个Java EE Web

grails - 在对象已经与该类持久化之后修改该类

grails - 在选项卡中,我有两个域

hibernate - hibernate 缓存问题

hibernate - Grails GORM映射尝试访问不存在的字段 “class”