0

我正在升级到 Grails 4.0.1,但我遇到了国际化问题。我不断收到NullPointerException错误消息java.lang.NullPointerException: Cannot invoke method getMessage() on null object。导致错误的代码行是:

  return messageSource.getMessage('dashboard.completed.label', 'Approved', LocaleContextHolder.getLocale())

当 Iprintln(messageSource)时,值为空。我试过添加

   spring: 
       messages:
           basename: grails-app/i8n/** 

到我的application.yml,但我仍然得到同样的错误。我想问题可能是我的 bean 丢失了resources.groovy,所以我将以下 messageSource bean 添加到resources.groovy

   beans = {
        messageSource(ReloadableResourceBundleMessageSource){
            basename = grails-app/i18n/messages
        }
   }

但是,这会产生以下错误org.grails.core.exceptions.GrailsConfigurationException: Error loading spring/resources.groovy file: No such property: grails for class: grails.spring.BeanBuilder

然后我决定尝试将 bean 放在一个resources.xml文件中,而不是resources.groovy.

  <bean id="messageSource"
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
     <property name="basename" value="grails-app/i18n/" />
     <property name="defaultEncoding" value="UTF-8" />
 </bean>

但这也会产生一个NullPointerException. 在搜索了互联网之后,我找到了一个资源,它通过在里面初始化 messageSource 来提出解决方法,bootstrap.groovy所以我在其中添加了以下内容:

  def messageSource

  def init = { servletContext ->
       messageSource.basenames = ['/grails-app/i18n/messages']
       messageSource.afterPropertiesSet()
  } 

这会产生相同的NullPointerException错误。

这在我升级之前工作正常。如果我println(messageSource)从内部bootstrap.groovy,程序打印基本名称数组。但是,println(messageSource)在注入消息源后在我的控制器中执行打印“null”。也许我在升级过程中遗漏了一些东西,但我不确定它是什么。有没有人知道我为什么会收到错误以及我可以采取哪些步骤来修复它?

4

2 回答 2

2

在控制器或服务导入中:

import org.springframework.context.MessageSource
import org.springframework.context.i18n.LocaleContextHolder

然后声明:

@Autowired
private MessageSource messageSource

并像这样使用:

messageSource.getMessage('my.message.properties.msg', null, 'Default Message', LocaleContextHolder.locale)

它适用于 Grails 4.0.1

于 2020-02-12T16:14:13.940 回答
1

请参阅https://github.com/jeffbrown/rookiecodermessagesource上的项目。

https://github.com/jeffbrown/rookiecodermessagesource/blob/78d8760cd057b8eda25f72ddca05390463cbb68b/grails-app/init/rookiecodermessagesource/BootStrap.groovy

package rookiecodermessagesource

class BootStrap {
    def messageSource

    def init = { servletContext ->
        println messageSource
    }
    def destroy = {
    }
}

这很好,因为它应该。

于 2020-01-15T16:25:13.617 回答