Data binding Grails绑定集合枚举
在我的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
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
}