1

尽管之前已经针对更旧版本的 grails 提出过这个或类似的问题,但我想知道从application.yml现代 grails 4.0.3 的 grails 域类中访问配置值的最佳方法是什么。

所以,假设我们有一个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 标签的方法。(请看下面的答案)

4

1 回答 1

1

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

在我的情况下,我需要将派生值显示为域属性和配置值的组合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())

  }

}

虽然这可能不是您正在寻找的答案,但我希望这能帮助其他有类似问题的人!

于 2020-07-23T14:45:53.350 回答