Используя механизм ввода данных, представленный в Grails 2.3, я предложил следующее решение для преобразования параметров запроса в коллекцию перечислений.Например, учитывая эти перечисления
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
в качестве bean-компонента Spring в resources.groovy
- не имеет значения, какое имя вы выбираете для bean-компонента.Затем, чтобы использовать приведенный выше класс для преобразования строки, разделенной запятыми, в коллекцию num, аннотируйте соответствующие свойства с помощью
class MyCommand {
@BindingFormat('Gender')
Collection<Gender> genders
@BindingFormat('Season')
Collection<Season> seasons
}
. Значение, переданное @BindingFormat
, должно быть простым именем типа перечисления, котороебудет храниться в связанной коллекции.