gpt4 book ai didi

data-binding - Grails 将请求参数绑定(bind)到枚举

转载 作者:行者123 更新时间:2023-12-04 01:39:01 27 4
gpt4 key购买 nike

我的 Grails 应用程序有大量的枚举,如下所示:

public enum Rating {
BEST("be"), GOOD("go"), AVERAGE("av"), BAD("ba"), WORST("wo")
final String id

private RateType(String id) {
this.id = id
}

static public RateType getEnumFromId(String value) {
values().find {it.id == value }
}
}

如果我有这样的命令对象:
class MyCommand {
Rating rating
}

我想(例如)自动将值为“wo”的请求参数转换为 Rating.WORST。

here 描述了定义自定义转换器的过程(在将字符串转换为日期的上下文中)。尽管此过程运行良好,但我不想为我的每个枚举创建一个实现 PropertyEditorSupport 的类。有更好的选择吗?

最佳答案

我找到了一个我很满意的解决方案。

第一步:创建 PropertyEditorSupport 的实现以将文本转换为相关 Enum 或从相关 Enum 转换文本

public class EnumEditor extends PropertyEditorSupport {

private Class<? extends Enum<?>> clazz

public EnumEditor(Class<? extends Enum<?>> clazz) {
this.clazz = clazz
}

public String getAsText() {
return value?.id
}

public void setAsText(String text) {
value = clazz.getEnumFromId(text)
}
}

第二步:定义一个类,将 EnumEditor 注册为各种枚举类的转换器。要更改可通过 id 绑定(bind)的枚举类列表,只需修改 BINDABLE_ENUMS
public class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar {

private static final String REQUIRED_METHOD_NAME = 'getEnumFromId'

// Add any enums that you want to bind to by ID into this list
private static final BINDABLE_ENUMS = [Rating, SomeOtherEnum, SomeOtherEnum2]

public void registerCustomEditors(PropertyEditorRegistry registry) {

BINDABLE_ENUMS.each {enumClass ->
registerEnum(registry, enumClass)
}
}

/**
* Register an enum to be bound by ID from a request parameter
* @param registry Registry of types eligible for data binding
* @param enumClass Class of the enum
*/
private registerEnum(PropertyEditorRegistry registry, Class<? extends Enum<?>> enumClass) {

boolean hasRequiredMethod = enumClass.metaClass.methods.any {MetaMethod method ->
method.isStatic() && method.name == REQUIRED_METHOD_NAME && method.parameterTypes.size() == 1
}

if (!hasRequiredMethod) {
throw new MissingMethodException(REQUIRED_METHOD_NAME, enumClass, [String].toArray())
}
registry.registerCustomEditor(enumClass, new EnumEditor(enumClass))
}
}

第三步:通过在 grails-app/conf/spring/resources.grooovy 中定义以下 Spring bean,让 Spring 了解上面的注册表。
customPropertyEditorRegistrar(CustomPropertyEditorRegistrar)

关于data-binding - Grails 将请求参数绑定(bind)到枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com