从Grails中的message.properties中获取一些值

时间:2011-07-21 18:50:29

标签: grails taglib grails-2.4

想要从作业中的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 个答案:

答案 0 :(得分:4)

您可以使用:

g.message(code: 'my.message.code')
//or
g.message(code: 'my.message.code', args: [arg1, arg2])

答案 1 :(得分:2)

您可以注入messageSource来检索邮件:

class MyJob {
    def messageSource

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

以下是getMessage()的文档;您需要提供更多方法参数,即argsObject[])和Locale

答案 2 :(得分:1)

您可以使用以下命令从任何地方获取对messageSource bean的引用:

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

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

然后,您可以使用MessageSource界面的方法自行获取消息。

答案 3 :(得分:0)

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

  1. 视图
  2. 控制器
  3. 服务
  4. 过滤器
  5. 实用程序文件(例如,在util包或广义异常消息处理中)
  6. 特殊文件,例如在Shiro安全休息领域
  7. 以下是详细的使用方案:

    1. 观点: - 我们有taglib可用的消息标记。在视图上使用它。

    2. 控制器: - 此处默认使用消息方法,并自动处理区域设置转换。请参阅enter link description here

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

      def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
      
    4. 或者将messageSource bean注入

      def messageSource 
      

      4.Filters / utility / Special files: - 对于这些,您可以创建类似下面的内容,然后在整个过程中使用它。

       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点的解决方案几乎适用于所有情况。如果你发现这里已经手动处理了locale,我们可以在从requestHeader获取或者可选地请求params之后传递。

      希望它有所帮助。