Grails - 从控制器获取消息值

31

如何在GSP之外获取消息属性的值?例如,相当于

<g:message code="some.message"/>

但是在控制器中呢?

2个回答

49

在控制器或标签库中,您可以使用以下内容:

g.message(code: 'some.message')

但是,在域类或服务内部,您需要注入messageSource并从Spring类AbstractMessageSource调用getMessage()方法。以下代码片段向您展示如何实现:

import org.springframework.context.i18n.LocaleContextHolder as LCH
...
class MyServiceOrMyDomain {
  def messageSource 
  ...
  messageSource.getMessage(code, msgArgs, defaultMsg, LCH.getLocale())
  ...
}

1
为了帮助可能遇到和我一样问题的人 - myArgs 必须是一个对象数组,例如:messageSource.getMessage("some.code", ["arg1"] as Object[], "default", LCH.getLocale()) - MBozic
2
我正在使用Grails 2.1。看起来你不能在控制器中使用g命名空间。使用message(code:“”)可以完成工作。现在,您可能只需要g命名空间用于标签库。http://grails.org/doc/2.1.0/guide/single.html#i18n - Thomas Buckley
1
我在一个带有特定领域版本的Grails 2.5.6领域类中遇到了以下错误:java.lang.NullPointerException: Cannot invoke method getMessage() on null object。 通过实例化成员变量messageSource,我解决了这个问题:def messageSource = grails.util.Holders.applicationContext.getBean("messageSource") - philburns

13

你还可以导入验证标签库并使用它来获取消息源。

import org.codehaus.groovy.grails.plugins.web.taglib.ValidationTagLib
def g = new ValidationTagLib()
g.message(error: error)

1
但它是否计算当前请求的区域设置? - fabien7474
1
g.message似乎比messageSource更好,因为它需要更少的代码,您不必处理异常,并且您已经知道如何使用它 - César

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接