Настройка Grails 3 PluginDescriptor - PullRequest
0 голосов
/ 27 марта 2020

Я конвертирую существующий проект Grails 2.5.6 в Grails 3.3.11.

В моем существующем приложении (Grails 2.5.6) дескриптор плагина имеет следующий код:

def doWithApplicationContext = { applicationContext ->
    def config = applicationContext.grailsApplication.config
    def key = config.property.key
    key.put(Constants.RESULT_CONST, [controller: "results", action: "showData", templatePath: "/results/data"])
}

Этот код отлично работает с более ранней версией грааля. Но после того, как я обновил до Grails 3.3.11, он выдает исключение: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

Это в строке:

key.put(Constants.RESULT_CONST, [controller: "results", action: "showData", templatePath: "/results/data"])

После просмотра типа ключ, т.е. config.property.key, он показывает тип как org.grails.config.NavigableMap$NullSafeNavigator.

Который с более старой версией был LinkedHashMap. Свойство property.key установлено в приложении. groovy отлично в /grails-app/conf/application.groovy property.key = [:]

Я также попытался установить тип property.key в дескрипторе плагина внешне для java.util.HashMap. Но похоже, что не приняли новый тип.

Что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Вместо того, чтобы пытаться сделать это динамически с этим:

def doWithApplicationContext = { applicationContext ->
    def config = applicationContext.grailsApplication.config
    def key = config.property.key
    key.put(2, [controller: "results", action: "showData", templatePath: "/results/data"]) 
}

Вы можете определить эти значения в grails-app/conf/plugin.yml следующим образом:

---
property:
  key:
    '2':
      controller: results
      action: showData
      templatePath: '/results/data`

РЕДАКТИРОВАТЬ

Вопрос изменился так, что вышеприведенное больше недействительно.

Вместо этого:

def config = applicationContext.grailsApplication.config
def key = config.property.key
key.put(Constants.RESULT_CONST, [controller: "results", action: "showData", templatePath: "/results/data"])

Вы можете упростить это до:

config.merge([property: [key: [Constants.RESULT_CONST, [controller: "results", action: "showData", templatePath: "/results/data"]]]])
0 голосов
/ 14 апреля 2020

Спасибо @Jeff за ваш ввод и предложение.

Вот сводный код для настройки параметров конфигурации и получения их в контроллере или любом другом компоненте grails.

Дескриптор плагина :

class ResultGrailsPlugin extends Plugin {
   void doWithApplicationContext() { 
      config.merge(['property': ['key': ["${Constants.RESULT_CONST}": [controller: "results", action: "showData", templatePath: "/results/data"]]]])
   }
}

Контроллер:

class ResultController {
   def index() {
      def resultConfigMap = grailsApplication.config.get('property.key.' + Constants.RESULT_CONST)
      ...
   }
}
...