Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在typesafe配置中从列表中删除项目?_Java_Playframework_Playframework 2.4_Playframework 2.5_Typesafe Config - Fatal编程技术网

Java 如何在typesafe配置中从列表中删除项目?

Java 如何在typesafe配置中从列表中删除项目?,java,playframework,playframework-2.4,playframework-2.5,typesafe-config,Java,Playframework,Playframework 2.4,Playframework 2.5,Typesafe Config,在类型安全配置中,有一个非常有用的运算符+=,它将一个值附加到现有的值列表中。是否有方法进行反向操作,即从现有列表中删除项目 在较新版本的Play Framework(2.4+)+=中,运算符用于告诉依赖项注入容器哪些模块已启用或禁用 play { modules { disabled += "play.api.cache.EhCacheModule" enabled += "com.github.mumoshu.play2.memcached.MemcachedModule

在类型安全配置中,有一个非常有用的运算符
+=
,它将一个值附加到现有的值列表中。是否有方法进行反向操作,即从现有列表中删除项目

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

play {
  modules {
    disabled += "play.api.cache.EhCacheModule"
    enabled += "com.github.mumoshu.play2.memcached.MemcachedModule"
  }
}
Typesafe配置还支持将配置文件包含到另一个配置文件中,这通常用于。不幸的是,Play将
已启用
已禁用
列为集合,一旦模块添加到
已禁用
列表中,就无法将其重新启用。这一直是问题的根源,甚至是使用
disabled
列表令人沮丧

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

为了能够有条件地禁用模块,我想出了一个丑陋的解决方法,使用了允许变量替换的typesafe配置特性

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
中的禁用。显然,这不是一个可接受的解决方案。

以下配置如何:

application.conf

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

include "application.conf"

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

不幸的是,您的第一个建议行不通,因为正如播放文档所示,第三方模块可能包含另一个配置文件
reference.conf
,其中定义了模块默认配置。模块可以添加到该文件中的enabled中,而Memcached模块确实做到了这一点。在这种情况下,如果启用EhCache而不显式禁用Mrmcached,注入器会抱怨冲突,因为绑定了多个实现。至于你的第二个建议,我同意这是一个更好的解决方案。谢谢,从我的答案中删除了这个建议。