Grails 4.0.1 - Внедрение в MessageSource и использование метода get. Сообщение об ошибке исключения нулевого указателя. - PullRequest
0 голосов
/ 14 января 2020

Я в процессе обновления до Grails 4.0.1, и у меня проблемы с интернационализацией. Я продолжаю получать NullPointerException ошибку java.lang.NullPointerException: Cannot invoke method getMessage() on null object. Строка кода, вызывающая ошибку:

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

Когда I println(messageSource), значение равно нулю. Я попытался добавить

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

к своему application.yml, но я все еще получаю ту же ошибку. Я подумал, что, возможно, проблема в том, что в моем resources.groovy отсутствует bean-компонент, поэтому я добавил следующий bean-компонент messageSource в 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.

Затем я решил попробовать поместить боб в файл 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. Проанализировав inte rnet, я нашел ресурс, который предложил обходной путь, инициализировав messageSource внутри bootstrap.groovy, поэтому добавил следующее:

  def messageSource

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

, выдающее ту же ошибку NullPointerException.

До обновления я работал нормально. Если я println(messageSource) изнутри bootstrap.groovy, программа печатает массив базовых имен. Тем не менее, выполнение println(messageSource) в моем контроллере после введения источника сообщения выводит «null». Возможно, я что-то упустил в процессе обновления, но я не уверен, что это такое. Кто-нибудь знает, почему я получаю сообщение об ошибке и возможные шаги, которые можно предпринять, чтобы исправить это?

Ответы [ 2 ]

1 голос
/ 15 января 2020

См. Проект на 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 = {
    }
}

Это прекрасно работает, как и должно.

0 голосов
/ 12 февраля 2020

В импорте контроллера или службы:

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

...