0

私は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 をスキャフォールディングと共に使用して、HTML 選択フィールドを生成し、messages.properties で次のようにオプションを変換可能にします。

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

しかし、ターゲット クラスの名前( my.package.MyDomainClass.MaritalStatus )を取得する方法が見つからず、代わりにmixin クラスの名前( 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

しかし、すべての列挙型に対して同じコードを繰り返すのではなく、 MessageSourceResolvableを実装する必要なメソッドをミックスインしたいと思います。

4

1 に答える 1

2

ミックスインは列挙型では機能しません。あなたにとって役立つかもしれません:

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
于 2013-09-07T21:41:58.343 に答える