在Spring Boot中,externalize my configuration有几个选项。但是,如何才能使这些属性不可配置,即只读。
具体而言,我想将server.tomcat.max-threads
设置为固定值,并且不希望启动应用程序的人有能力更改它。例如,可以通过将其作为命令行参数传递来轻松完成。
默认情况下,这可能是不可能的,也许有人可以建议解决方法?
答案 0 :(得分:1)
您有2个选项
System.setProperty("prop", "value")
属性硬编码使用将覆盖所有其他属性的属性
设置系统属性硬编码
public static void main(String[] args) {
System.setProperty("server.tomcat.max-threads","200");
SpringApplication.run(DemoApplication.class, args);
}
secure.properties
中的属性会覆盖所有其他属性(请参阅Prevent overriding some property in application.properties - Spring Boot)
@Configuration
public class SecurePropertiesConfig {
@Autowired
private ConfigurableEnvironment env;
@Autowired
public void setConfigurableEnvironment(ConfigurableEnvironment env) {
try {
final Resource resource = new
ClassPathResource("secure.properties");
env.getPropertySources().addFirst(new
PropertiesPropertySource(resource.getFilename(),
PropertiesLoaderUtils.loadProperties(resource)));
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
答案 1 :(得分:0)
我最终实现了ApplicationContextInitializer
(Docu),其initialize()
方法只是以编程方式设置静态值:
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
Map<String, Object> props = new HashMap<>();
props.put(MAX_THREADS, MAX_THREADS_VAL);
environment.getPropertySources().addFirst(new MapPropertySource("tomcatConfigProperties", props));
}
此处找到了另一种可能的解决方案:Prevent overriding some property in application.properties - Spring Boot