Grails — как получить доступ к значениям конфигурации в классах предметной области?

Хотя этот или подобные вопросы уже задавались для более старых версий Grails, мне интересно, как лучше всего получить доступ к значению конфигурации из application.yml в доменном классе Grails с современными версиями Grails 4.0.3.

Итак, допустим, у нас есть voucher.groovy вроде

class Voucher implements HibernateEntity<Voucher> {
  ...

  Date reservedAt

  static transients = ['validUntil']

  Date getValidUntil() {
    Integer expirationTime = // TODO: fill in the configuration value

    DateTime expirationDateTime = new DateTime(this.reservedAt)
        .plusDays(expirationTime)
        .withHourOfDay(23)
        .withMinuteOfHour(59)
        .withSecondOfMinute(59)
        .withMillisOfSecond(999)
    return expirationDateTime.toDate()
  }

}

и значение конфигурации с именем voucher.expirationTime в нашем application.yml лайке

...
voucher.expirationTime: 10
...

Как я могу получить доступ к значению конфигурации в моем методе getValidUntil()?

ИЗМЕНИТЬ

Как упомянул в своем комментарии @JeffScottBrown, вы не должны получать доступ к значениям конфигурации в своем классе домена. Так что я остановился на предложенном им подходе с использованием пользовательского тега gsp. (см. ответ ниже)


person feuernurmitm    schedule 23.07.2020    source источник
comment
Я оставляю комментарий вместо ответа, потому что это не отвечает на ваш вопрос, как задано. Как получить доступ к значениям конфигурации в классах домена? Вы не должны получать доступ к значениям конфигурации в классах предметной области. Лучшей идеей по ряду причин является перемещение логики, которой требуется конфигурация, в службу и внедрение значений конфигурации туда с помощью @Value.   -  person Jeff Scott Brown    schedule 23.07.2020
comment
Спасибо, @JeffScottBrown! Моя конечная цель - показать дату validUntil в gsp. Имеет ли смысл получить доступ к значению конфигурации в представлении или, скорее, получить Voucher через службу и добавить дополнительные переходные значения в эту службу?   -  person feuernurmitm    schedule 23.07.2020
comment
Имеет ли смысл получить доступ к значению конфигурации в представлении или, скорее, получить ваучер через службу и добавить дополнительные временные значения в эту службу? - Я бы не стал делать ни того, ни другого. Я бы поместил логику в пользовательский тег GSP, который очень просто написать, и в него также можно вводить значения конфигурации с помощью @Value. Это исключает логику из вашего GSP, и это хорошо.   -  person Jeff Scott Brown    schedule 23.07.2020
comment
@JeffScottBrown Я не думаю, что доступ к значениям конфигурации в классах домена в целом является злом. Да, обычно это происходит очень редко, но я могу себе представить несколько случаев, когда конфиг оказывает какое-то влияние на сохранение домена. Кроме того, я не хочу нарушать шаблон активной записи и создавать службы только для того, чтобы иметь возможность получить некоторые значения конфигурации...   -  person injecteer    schedule 23.07.2020


Ответы (1)


Как получить доступ к значениям конфигурации в классах домена? Вы не должны!

В моем случае мне нужно было отобразить производное значение как комбинацию атрибута домена и значения конфигурации reservedAt + expirationTime. Благодаря комментарию Джеффа Скотта Брауна мне удалось создать собственный тег gsp для моей цели:

class VoucherTagLib {
  static returnObjectForTags = ['validUntil']
  static namespace = "voucher"

  @Value('${voucher.expirationTime}')
  Integer expirationTime

  GrailsTagDateHelper grailsTagDateHelper

  def validUntil = { attrs, body ->
    Date reservedAt = attrs.reservedAt
    String style = attrs.style ?: "SHORT"

    Locale locale = GrailsWebRequest.lookup().getLocale()
    if (locale == null) {
      locale = Locale.getDefault()
    }
    def timeZone = grailsTagDateHelper.getTimeZone()

    def dateFormat = grailsTagDateHelper.getDateFormat(style, timeZone, locale)

    DateTime expirationDateTime = new DateTime(reservedAt)
        .plusDays(expirationTime - 1)
        .withHourOfDay(23)
        .withMinuteOfHour(59)
        .withSecondOfMinute(59)
        .withMillisOfSecond(999)

    return grailsTagDateHelper.format(dateFormat, expirationDateTime.toDate())

  }

}

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

person feuernurmitm    schedule 23.07.2020