2

message.properties在工作中从 grails 中的文件中获取值,我该怎么做?

我的工作:

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

您可以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 回答
1

正如上述答案的补充,您可能需要在以下地方实现国际化或从消息包中获取消息。

  1. 意见
  2. 控制器
  3. 服务
  4. 过滤器
  5. 实用程序文件(例如在 util 包或通用异常消息处理中)
  6. 特殊文件,例如 Shiro 安全休息领域

以下是详细的使用场景:

  1. 意见:- 我们有带有消息标签的标签库。在视图上使用它。

  2. 控制器:- 默认情况下,此处提供消息方法,并自动处理区域设置转换。请参阅在此处输入链接描述

  3. 服务:我们可以在服务中调用标签库,如下所示:

    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 或请求参数(可选)获取后传递。

希望能帮助到你。

于 2015-10-29T09:33:28.743 回答