나는 꽤 행복 해요 해결책을 발견했다.
1 단계 : 다양한 열거 클래스 변환기로 EnumEditor을 등록하는 클래스를 정의 :는 관련 열거
로/
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)
}
}
2 단계를 텍스트로 변환하는 PropertyEditorSupport의 구현을 작성합니다. ID로 바인딩입니다 열거 클래스의 목록을 변경하려면, 바로 수정 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))
}
}
3 단계 : 레지스트리의 봄을 인식 위
customPropertyEditorRegistrar(CustomPropertyEditorRegistrar)
잘 했어! 나는 같은 문제로 어려움을 겪고있다. Grails의 표준 부분이 아닌 이유는 무엇입니까? 요청 매개 변수를 도메인/명령 객체에 바인딩하는 Grails의 지원은 정말 끔찍합니다. – mcv
Grails는 enum에 대한 바인딩 요청 파라미터를 지원하지만, 기본값은 이름으로 바인딩됩니다. 위와 같이 다른 enum 속성 (예 : id)을 사용하여 바인딩하려는 경우 직접 바인딩을 정의해야합니다 –