【问题标题】:Fetching some value from message.properties in Grails从 Grails 中的 message.properties 中获取一些值
【发布时间】:2011-10-10 12:03:42
【问题描述】:

想要在作业中从 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()
        }
    }
}

【问题讨论】:

    标签: grails taglib grails-2.4


    【解决方案1】:

    你可以使用:

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

    【讨论】:

    • 标签库是否自动可用于 Quartz 作业?我从来没有尝试过使用...
    • 这也是我的问题。我需要访问域类中的消息包......而且 g.message 语法很好,但在域类中不起作用......
    • 正如 Don 建议的那样,您必须从应用程序持有者那里获得它 - ApplicationHolder.application.mainContext.getBean('messageSource')
    【解决方案2】:

    您可以注入messageSource 来检索消息:

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

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

    【讨论】:

    • 默认情况下 Quartz 作业是否有资格进行依赖注入?
    • @Don - 是的,Quartz 作业支持依赖注入。
    【解决方案3】:

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

    import org.codehaus.groovy.grails.commons.ApplicationHolder
    import org.springframework.context.MessageSource
    
    MessageSource messageSource = ApplicationHolder.application.mainContext.getBean('messageSource')
    

    然后您可以使用MessageSource 接口的方法自己获取消息。

    【讨论】:

      【解决方案4】:

      除了上述答案之外,您可能需要在以下地方实现国际化或从消息包中获取消息。

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

      以下是详细的使用场景:

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

      2. controllers :- 默认情况下,此处提供消息方法,并自动处理区域设置转换。见enter link description here

      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 或请求参数中获取后传递。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多