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

Grails-如何访问域类中的配置值?,grails,grails-4,Grails,Grails 4,尽管以前对于更旧版本的grails曾提出过这样或类似的问题,但我想知道在现代grails 4.0.3的grails域类中,从application.yml访问配置值的最佳方法是什么 那么,假设我们有一个凭证。groovy类似 class Voucher implements HibernateEntity<Voucher> { ... Date reservedAt static transients = ['validUntil'] Date getValid

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

那么,假设我们有一个
凭证。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: 10
...
如何访问我的
getValidUntil()
方法中的配置值

编辑


正如@JeffScottBrown在他的评论中提到的,您不应该访问域类中的配置值。因此,我最终与他建议的apporach使用定制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())

  }

}

虽然这可能不是你想要的答案,但我希望这能帮助其他有类似问题的人

我留下了一条评论而不是答案,因为这并没有回答您的问题“如何访问域类中的配置值?”。您不应该访问域类中的配置值。出于多种原因,更好的办法是将需要配置的逻辑移动到服务中,并使用
@Value
将配置值注入其中。谢谢,@JeffScottBrown!我的最终目标是在gsp中显示
validUntil
日期。访问视图中的配置值,或者通过服务获取
凭证
,并在该服务中添加额外的瞬时值,有意义吗?“访问视图中的配置值,或者通过服务获取凭证,并在此服务中添加额外的瞬时值,有意义吗?”-这两个我都不会做。我将把逻辑放在一个定制的GSP标记中,这个标记编写起来非常简单,还可以使用
@Value
将配置值注入其中。这将逻辑排除在GSP之外,这是好的。@JeffScottBrown我不认为访问域类中的配置值通常是坏的。是的,通常很少发生,但我可以想象在某些情况下,配置对域的持久化有一定的影响。另外,我不想打破活动记录模式,创建服务只是为了能够获取一些配置值。。。