2016-11-25 9 views
2

ビジネスロジックでいくつかのタイプのエラーメッセージが必要なWebアプリケーションを開発しています。Grails 2.5.5 - サービス層でエラーメッセージの国際化を改善する方法は?

私のサービス層でこれが原因で私はmessageSourceへのいくつかの呼び出しがあります。同時に

def messageSource 

私は、ユーザによって指定されLocaleを定義する必要があるので、私のアプリケーションは、いくつかの言語をサポートしている必要があります。

は、次のように私は Localeを取得しています、これを行うには:

def request = RequestContextHolder.currentRequestAttributes().request 
Locale myLocale = RequestContextUtils.getLocale(request) 

しかし、私は、このコードは私のサービス層全体に繰り返されることに注意してください。すなわち:

def myMethod(){ 
    ... 
    messageSource.getMessage("message.code", [args] as Object[],"Default message",getLocale()) 
    ... 
} 

Locale getLocale(){ 
    def request = RequestContextHolder.currentRequestAttributes().request 
    return RequestContextUtils.getLocale(request) 
} 

私のすべてのサービスとコントローラの間でこの方法を共有するためのエレガントな方法はありますか?または、この動作を改善する他の方法がありますか?

のGrails 2.5.5 - Groovyの2.4.4

ありがとう!

答えて

2

Groovyの特性でメソッドを実装してから、そのサービスの特性を使用することができます。

のsrc /グルーヴィー/ COM/fooの/バー/ SessionLocale

trait SessionLocale { 
    def getMessage(String code, String defaultMessage, Object [] args) { 
     messageSource.getMessage(code, args, defaultMessage,getLocale()) 
    } 

    Locale getLocale(){ 
     def request = RequestContextHolder.currentRequestAttributes().request 
     return RequestContextUtils.getLocale(request) 
    } 
} 

Grailsのアプリ/サービス/ COM/fooの/バー/ SomeService

class SomeService implements SessionLocale { 
    def myMethod(){ 
     ... 
     getMessage("message.code", "Default message", [args] as Object[]) 
     ... 
    } 
} 
+0

UserLocaleは形質である場合so .. SomeServiceは、UserLocaleを拡張または実装していますか? – NachoB

+0

good'ol継承に何が問題なのですか? – injecteer

+0

私は道具を試しましたが、それはコンパイルされませんでしたが、私はあなたが正しいと思うし、それは実装すべきです。 @インジェクターLOL!技術的にも継承はうまくいくでしょう。しかし、追加のメソッドを再利用する必要がある場合は、 "god base class"または混乱するクラス階層のいずれかになります。特性によって、必要な行動だけを引き出すことが可能になります。 –

関連する問題