通用ValueConverter

时间:2018-03-20 12:42:03

标签: grails gorm

我正在尝试注册一个自定义通用值转换器,但它没有在绑定过程中被拾取。什么可能是错的。它基于本手册:https://docs.grails.org/latest/guide/theWebLayer.html#dataBinding 当我删除泛型时,一切正常。

我的通用枚举转换器:

abstract class EnumValueConverter < T extends Enum > implements ValueConverter {
    @Override
    boolean canConvert(Object value) {
        value instanceof String
    }

    @Override
    Object convert(Object value) {
        try {
            T.valueOf(value)
        } catch (IllegalArgumentException illegalArgumentException) {
            throw new IllegalArgumentException("needs to be one of ${T.values()*.name()} but is: $value")
        }
    }

    @Override
    Class<?> getTargetType() {
        T
    }
}

我的特定转换器:

class SomeEnumValueConverter extends EnumValueConverter<SomeEnum>{}

资源注册:

someEnumValueConverter SomeEnumValueConverter

1 个答案:

答案 0 :(得分:0)

您不能在这样的上下文中使用泛型。如果您在该实例上创建SomeEnumValueConverter的实例并调用getTargetType(),则返回值将为Object,而不是SomeEnum,因此框架不知道该类型是什么类型转换器应该用于。

您可以覆盖SomeEnumValueConverter中的getTargetType()方法并返回SomeEnum