§Java 配置 API 迁移
类 play.Configuration
已弃用,建议直接使用 Typesafe Config。因此,您现在必须使用 com.typesafe.config.Config
,而不是 play.Configuration
。例如
之前
import play.Configuration;
public class Foo {
private final Configuration configuration;
@javax.inject.Inject
public Foo(Configuration configuration) {
this.configuration = configuration;
}
}
之后
import com.typesafe.config.Config;
public class Foo {
private final Config config;
@javax.inject.Inject
public Foo(Config config) {
this.config = config;
}
}
§配置值应始终定义
Config
和 play.Configuration
API 之间的主要区别在于如何处理默认值。Typesafe Config 建议 在您的 .conf
文件中声明所有配置键,包括默认值。
Play 本身使用 reference.conf
文件来声明所有可能配置的默认值。为了避免处理缺失值的麻烦,如果您正在分发库,也可以这样做。读取配置时,application.conf
文件会叠加在 reference.conf
配置之上。例如
之前 (configuration
是 play.Configuration
)
// Here we have the default values inside the code, which is not the idiomatic way when using Typesafe Config.
Long timeout = configuration.getMilliseconds("my.service.timeout", 5000); // 5 seconds
之后
# This is declared in `conf/reference.conf`.
my.service.timeout = 5 seconds
最终可以在您的 application.conf
文件中覆盖该值
# This will override the value declared in reference.conf
my.service.timeout = 10 seconds
这在创建模块时特别有用,因为您的模块可以提供易于覆盖的参考值。然后您的 Java 代码将如下所示
Long timeout = config.getDuration("my.service.timeout", TimeUnit.MILLISECONDS);
其中 config
是您的 com.typesafe.config.Config
实例。
§手动检查值
如果您不想或由于某种原因无法拥有默认值,可以使用 Config.hasPath
或 Config.hasPathOrNull
在访问值之前检查它是否已配置。如果需要配置但无法提供参考 (默认) 值,这是一个更好的选择
import com.typesafe.config.Config;
import com.typesafe.config.ConfigException;
public class EmailServerConfig {
private static final String SERVER_ADDRESS_KEY = "my.smtp.server.address";
private final Config config;
@javax.inject.Inject
public EmailServerConfig(Config config) {
this.config = config;
}
// The relevant code is here. First use `hasPath` to check if the configuration
// exists and, if not, throw an exception.
public String getSmtpAddress() {
if (config.hasPath(SERVER_ADDRESS_KEY)) {
return config.getString(SERVER_ADDRESS_KEY);
} else {
throw new ConfigException.Missing(SERVER_ADDRESS_KEY);
}
}
}
下一步:Play 2.5
在文档中发现错误? 此页面的源代码可以在这里找到 这里。 阅读完 文档指南 后,请随时贡献拉取请求。 有问题或建议要分享? 前往 我们的社区论坛 与社区交流。