Grails - 如何访问域 类 中的配置值?

Grails - How to access configuration values in domain classes?

虽然之前针对更旧版本的 grails 已经问过这个或类似的问题,但我想知道从 grails 域 class 中的 application.yml 访问配置值的最佳方法是什么现代圣杯 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 like

...
voucher.expirationTime: 10
...

如何在我的 getValidUntil() 方法中访问配置值?

编辑

正如@JeffScottBrown 在他的评论中提到的,您不应该访问您域中的配置值 class。所以我最终得到了他建议的使用自定义 gsp 标签的方法。 (见下面的答案)

如何访问域 类 中的配置值?你不应该!

在我的例子中,我需要将派生值显示为域属性和配置值的组合 reservedAt + expirationTime。 感谢 Jeff Scott Brown 的评论,我设法为我的目的创建了一个自定义 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())

  }

}

虽然这可能不是您要找的答案,但我希望这能对遇到类似问题的其他人有所帮助!