如何获得groovy mixin的目标类?

时间:2013-09-07 18:39:01

标签: grails groovy enums internationalization mixins

我正在尝试在Grails中执行以下操作:

class I18nEnum implements MessageSourceResolvable {
    public Object[] getArguments() { [] as Object[] }
    public String[] getCodes() { [ this.class.canonicalName+'.'+name() ] }
    public String getDefaultMessage() { "?-" + name() }
}

然后像这样使用这个类:

class MyDomainClass {
    @Mixin(I18nEnum)
    public static enum MaritalStatus {
        SINGLE, MARRIED
    }
    MaritalStatus maritalStatus
}

然后MyDomainClass与scaffolding一起用于生成HTML选择字段,并在messages.properties中提供可翻译的选项,如下所示:

my.package.MyDomainClass.MaritalStatus.SINGLE  = Single
my.package.MyDomainClass.MaritalStatus.MARRIED = Married

但我无法找到获取目标类 my.package.MyDomainClass.MaritalStatus )名称的方法,而是获得了<的名称< strong> mixin class ( my.package.I18nEnum@1dd658e9

如何获得groovy mixin的目标类?

有没有办法做这样的事情?

    public String[] getCodes() { [ this.targetClass.canonicalName+'.'+name() ] }

或者喜欢这个?

    public String[] getCodes() { [ this.mixinTargetClass.canonicalName+'.'+name() ] }

注意: 目前,我使枚举国际化功能工作的唯一方法就是为每个人复制粘贴应用程序中定义的枚举类:

public static enum MaritalStatus implements MessageSourceResolvable {
    SINGLE, MARRIED
    public Object[] getArguments() { [] as Object[] }
    public String[] getCodes() { [ this.class.canonicalName+'.'+name() ] }
    public String getDefaultMessage() { name() }
}
MaritalStatus maritalStatus

但我想为每个枚举不重复相同的代码,而只是 mixin 实现 MessageSourceResolvable 所需的方法。

1 个答案:

答案 0 :(得分:2)

Mixins不适用于枚举。可能对你有用:

class Mix {
    def enumClazz
    Mix(def clz) { enumClazz = clz }
    def getCode() { println "---> ${enumClazz.name()}"}
}


enum MaritalStatus {
    SINGLE, MARRIED    

    @Delegate Mix mixClz = new Mix(this)
}

MaritalStatus.MARRIED.code