Привязка свойства с помощью @Value к замыканию в Grails - PullRequest
0 голосов
/ 19 марта 2020

У меня есть плагин Grails (4.0.1), где я пытаюсь связать свойства способом Grails c.

Мой источник данных во время выполнения. groovy выглядит следующим образом:

dataSource {
    dbCreate = 'none'
    pooled = true
    username = "root"
    password = ""
    dialect = UTF8MySQL5InnoDBDialect.name
    driverClassName = "com.mysql.jdbc.Driver"
    properties {
        jmxEnabled = false
        initialSize = 5
    }
    remoteDataSources {
        disabled = false
        urlGenerator = { String host ->
            "jdbc:mysql://${host}:3306/myDb?characterEncoding=utf8"
        }
    }
}

Доступ к вышеуказанной конфигурации работает нормально с использованием методов Grails;

def dbConfig = grailsApplication.config.dataSource
String dbUrl = dbConfig.urlGenerator(thisHost)

Но когда я пытаюсь и использую подход Grails Agnosti c (Spring Boot), я не могу связать его;

@Value('${dataSource}')
private Map dataSource

Кажется, что доступ по отдельности работает;

@Value('${dataSource.remoteDataSources.disabled}')
private boolean disabled

Но главная проблема заключается в с закрытием;

@Value('${dataSource.remoteDataSources.urlGenerator}')
private Closure urlGenerator

В результате;

java .lang.IllegalStateException: Невозможно преобразовать значение типа 'java .lang.String' в требуемый тип 'groovy .lang.Closure': не найдено ни одного подходящего редактора или стратегии конвертации

Я не уверен, что то, что я пытаюсь сделать, возможно, но на всякий случай, если у кого-то есть идеи лучшего подхода или обходного пути, это было бы здорово!

1 Ответ

0 голосов
/ 20 марта 2020

Я не мог заставить это работать, поэтому я обошел это, используя вместо этого аннотацию @ConfigurationProperties.

Я применил следующее руководство к моему подобному случаю; https://guides.grails.org/grails-configuration-properties/guide/index.html

Но отметили следующие наблюдения, которые могут помочь другим:

  • Если вы создаете класс конфигурации вне структуры каталогов Grails, убедитесь, что зарегистрируйте bean-компонент в ресурсах. groovy
  • Вы должны использовать строчное значение для префикса datasource, иначе вы получите ошибку. Хотя это все равно будет связано с конфигурацией dataSource в ваших свойствах.
  • Конфигурация Closure не может быть вложенной и должна быть на верхнем уровне, чтобы ее тип мог быть указан как таковой.

Так, например;

dataSource {
    username = 'root'
    password = ''
    // etc
    properties {
        jmxEnabled = false
        initialSize = 5
    }

    disabled = false
    urlGenerator = { String host ->
        "jdbc:mysql://${host}:3306/myDb?characterEncoding=utf8"
    }
}

Мой класс:

@Configuration
@ConfigurationProperties(prefix = "datasource")
class DataSourceConfiguration {

    String username
    String password

    Map<String, String> properties

    boolean disabled
    Closure urlGenerator

}

Это был мой опыт во время написания с использованием Grails 4.0.1. Я не буду отмечать это как ответ (так как он не дает прямого ответа на вопрос), но я хотел бы внести его, если это поможет другим, кто находится в той же ситуации, что и я, где обходной путь был удовлетворительным.

...