1

そのため、実装しているgrailsプロジェクトでJodaTimeプラグインを使用していますが、toStringを実行するときにISO8601日付形式を吐き出すのが本当に好きではありません。私は常に toString を入れてメッセージファイルから default.date.format を渡してきましたが、それは面倒です。ほとんどの場合、それを自動的に実行したいだけです。したがって、Groovy の優れたメタプログラミングを利用して、DateTime クラスの toString をオーバーライドするのは当然のことです。しかし、残念ながらうまくいきません。したがって、この議論:

http://jira.codehaus.org/browse/GROOVY-4210

したがって、前述の説明によると、クラスが toString メソッドを実装するインターフェイスを実装する場合、インターフェイスのメタクラスをオーバーライドする必要があります。Joda のコード ベースを見ると、DateTime は ReadableDateTime インターフェイスを実装しています。これは、メソッド シグネチャが定義されている ReadableInstant を継承しています。実際の実装は、DateTime のクラス階層の 4 クラス上で行われます (DateTime は、BaseDateTime から継承します。AbstractDateTime は、パラメーターなしで toString を実装する AbstractInstant から継承します)。ここまで私と?

したがって、理論的には、これは、実際には toString シグネチャを持たない ReadableDateTime インターフェースか、そうである ReadableInstant インターフェースのいずれかをオーバーライドする必要があることを意味します。ReadableDateTime で toString をオーバーライドする次のコードは何もしません。

ReadableDateTime.metaClass.toString = { ->
    delegate.toString(messageSource.getMessage(
        'default.date.format', null, LCH.getLocale()))
}

次に、ReadableInstant を試してみます。

ReadableInstant.metaClass.toString = { ->
    delegate.toString(messageSource.getMessage(
        'default.date.format', null, LCH.getLocale()))
}

また、DateTime.toString メソッドの望ましい結果も得られません。ただし、ここには興味深い効果がいくつかあります。次のコードを見てください。

def aiToString = AbstractInstant.metaClass.getMetaMethod("toString", [] as Class[])
def adtToString = AbstractDateTime.metaClass.getMetaMethod("toString", [] as Class[])
def bdtToString = BaseDateTime.metaClass.getMetaMethod("toString", [] as Class[])
def dtToString = DateTime.metaClass.getMetaMethod("toString", [] as Class[])

def date = new DateTime()
println "ai: ${aiToString.invoke(date)} "
println "adt: ${adtToString.invoke(date)} "
println "bdt: ${bdtToString.invoke(date)} "
println "dt: ${dtToString.invoke(date)} "

最初の 3 つの方法は、私の日付が希望どおりにフォーマットされていることを示しています。最後のものはまだ ISO8601 形式の日付を示しています。grails の JodaTime プラグインが toString をオーバーライドしている可能性があり、これらのインターフェイスにいくつかのメソッドを追加している可能性があると思いましたが、toString とは何の関係もありません。この時点で、私は途方に暮れています。誰にもアイデアがありますか?

ありがとう

4

1 に答える 1