【问题标题】:Grails - How to access configuration values in domain classes?Grails - 如何访问域类中的配置值?
【发布时间】:2020-07-23 11:16:39
【问题描述】:

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

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

【问题讨论】:

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

标签: grails grails-4


【解决方案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())

  }

}

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

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 2012-10-10
    • 2010-10-14
    • 2012-11-14
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多