【问题标题】:How to remove an item from list in typesafe config?如何从类型安全配置中的列表中删除项目?
【发布时间】:2017-03-11 19:13:11
【问题描述】:

在 Typesafe 配置中,有一个非常有用的运算符 += 将一个值附加到现有的值列表中。有没有办法做反向,即从现有列表中删除一个项目?

在较新版本的 Play Framework (2.4+) 中,+= 运算符用于告诉依赖注入容器启用或禁用哪些模块。

play {
  modules {
    disabled += "play.api.cache.EhCacheModule"
    enabled += "com.github.mumoshu.play2.memcached.MemcachedModule"
  }
}

Typesafe config 还支持将配置文件相互包含,这通常用于partially override configuration in different environments。不幸的是,Play 将 enableddisabled 列表视为集合,一旦将模块添加到 disabled 列表中,就无法重新启用它。这一直是问题的根源,甚至是 special note is given in Play's documentation 不鼓励使用 disabled 列表。

注意:如果您正在使用库,强烈建议不要使用 play.modules.disabled 禁用模块,因为当应用程序加载模块时,它可能会导致不确定的结果(请参阅此问题了解原因你不应该触摸 play.modules.disabled)。实际上,play.modules.disabled 旨在让最终用户能够覆盖默认启用的模块。

为了能够有条件地禁用模块,我想出了一个丑陋的解决方法,它使用了允许变量替换的类型安全配置功能

application.conf我有

play {
  modules {
    disabled +=  ${memcached.disabled}"com.github.mumoshu.play2.memcached.MemcachedModule"
  }
}

memcached.disabled = ""

然后在production.conf 我放了这样的东西

include "application.conf"

memcached.disabled = "x"
play.modules.disabled += "play.api.cache.EhCacheModule"

所以当使用production.conf 时,它会破坏application.conf 中的禁用。显然这不是一个可接受的解决方案。

【问题讨论】:

    标签: java playframework playframework-2.4 playframework-2.5 typesafe-config


    【解决方案1】:

    下面的配置呢:

    应用程序.conf

    play {
      modules {
        enabled += "play.api.cache.EhCacheModule"
      }
    }
    

    生产.conf

    include "application.conf"
    
    play {
      modules {
        enabled += "com.github.mumoshu.play2.memcached.MemcachedModule"
        disabled += "play.api.cache.EhCacheModule"
      }
    }
    

    【讨论】:

    • 不幸的是,您的第一个建议不起作用,因为 Play 文档建议第三方模块可能包含另一个配置文件 reference.conf,其中定义了模块默认配置。可以在该文件中添加模块以启用,实际上 Memcached 模块可以做到这一点。在这种情况下,如果您启用 EhCache 并且没有明确禁用 Mrmcached,则注入器会抱怨冲突,因为绑定了多个实现。至于您的第二个建议,我同意这是一个更好的解决方案。
    • 谢谢,从我的回答中删除了该建议。
    猜你喜欢
    • 2019-04-24
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多