2

ジョブで grails のファイルから値をフェッチしたいのですがmessage.properties、どうすればいいですか??

私の仕事:

def execute() {
    // execute task
    List<String> emails = NayaxUser.findAllByEmailSent(false)*.username
    emails.each {emailAddress->
        mailService.sendMail {
            //todo: FETCH FROM MESSAGE.PROPERTIES
            to emailAddress
            from FETCH FROM MESSAGE.PROPERTIES
            subject FETCH FROM MESSAGE.PROPERTIES
            html body.toString()
        }
    }
}
4

4 に答える 4

4

以下を使用できます。

g.message(code: 'my.message.code')
//or
g.message(code: 'my.message.code', args: [arg1, arg2])
于 2011-07-21T19:25:44.043 に答える
2

を挿入しmessageSourceてメッセージを取得できます。

class MyJob {
    def messageSource

    def execute() {
        ...
        def message = messageSource.getMessage('message.code', ...)
        ...
    }
}

のドキュメントは次のとおりですgetMessage()argsさらにいくつかのメソッド引数、つまり(an Object[]) と a を指定する必要がありますLocale

于 2011-07-21T19:33:46.417 に答える
1

上記の回答に加えて、国際化を実装するか、メッセージバンドルからメッセージを取得する必要がある次の場所がある可能性があります。

  1. ビュー
  2. コントローラー
  3. サービス
  4. フィルター
  5. ユーティリティ ファイル (例: util パッケージまたは一般化された例外メッセージ処理内)
  6. Shiro セキュリティ レスト レルムなどの特殊ファイル

以下は、詳細な使用シナリオです。

  1. ビュー:- メッセージ タグで利用可能な taglib があります。ビューでこれを使用します。

  2. controllers :- メッセージ メソッドはデフォルトでここで利用可能で、ロケール変換は自動的に処理されます。ここにリンクの説明を入力してください

  3. service: 次のように、サービス内で taglibs を呼び出すことができます。

    def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
    

または、messageSource Bean を次のように注入します。

def messageSource 

4. フィルター / ユーティリティ / 特殊ファイル:- これらについては、以下のようなものを作成して、全体で使用できます。

 String i18nMessage(def input,String defaultMessage) {
                String[] languageCode = RequestContextHolder.currentRequestAttributes().request.getHeader("Accept-Language").split("-")
                Locale locale = languageCode.length == 2 ? new Locale(languageCode[0], languageCode[1]) : new Locale(languageCode[0])
                String message = defaultMessage
                try {
                    message = messageSource.getMessage(input.code,input?.args?.toArray(),locale)
                }catch (NoSuchMessageException nsme ){
                    log.info("No such error message--> ${nsme.getMessage()}")
                }
                return message
            }

また、以下の例外が発生した場合:

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

次に、リクエスト リスナーを web.xml に追加する必要がある場合があります。

 <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
</listener>

注: web.xml はデフォルトでは使用できないため、テンプレートから生成する必要があります。

これらは、メッセージ バンドルの変換が必要になる最も一般的な場所です。ポイント4の解決策は、ほとんどすべての場合に機能します。ここでロケールが手動で処理されていることに気付いた場合は、オプションで requestHeader または request params からフェッチした後に渡すことができます。

それが役に立てば幸い。

于 2015-10-29T09:33:28.743 に答える
1

messageSource以下を使用して、どこからでも Beanへの参照を取得できます。

import org.codehaus.groovy.grails.commons.ApplicationHolder
import org.springframework.context.MessageSource

MessageSource messageSource = ApplicationHolder.application.mainContext.getBean('messageSource')

その後、 MessageSourceインターフェイスのメソッドを使用してメッセージ自体を取得できます。

于 2011-07-22T08:33:57.867 に答える