如何在Spring Boot中强制禁用DDL操作,避免配置文件修改后生效
解决方案
你之前的方法失效的原因是Spring Boot有严格的属性源优先级规则,SpringApplication.setDefaultProperties() 设置的是优先级最低的默认属性,application.yml/properties 配置文件的属性优先级远高于默认属性,因此会覆盖你代码中设置的默认值。
以下是两种可实现配置硬锁的可行方案,用户修改配置文件的对应参数不会生效:
方案1:使用命令行参数注入(最简方案)
命令行参数的优先级高于配置文件属性,直接在启动时强制注入这两个参数即可,修改启动类代码如下:
@SpringBootApplication public class Main { public static void main(String[] args) { // 将强制配置作为命令行参数加入,优先级高于配置文件 List<String> argList = new ArrayList<>(Arrays.asList(args)); argList.add("--spring.jpa.hibernate.ddl-auto=none"); argList.add("--spring.jpa.generate-ddl=false"); SpringApplication.run(Main.class, argList.toArray(new String[0])); } }
方案2:使用EnvironmentPostProcessor(最稳妥方案)
通过Spring Boot的环境后置处理器,将强制配置添加到最高优先级的属性源中,所有其他属性源都无法覆盖该配置:
- 编写环境后置处理器实现类
import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import java.util.HashMap; import java.util.Map; public class ForceJpaDisableDdlPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Map<String, Object> forceProps = new HashMap<>(); forceProps.put("spring.jpa.hibernate.ddl-auto", "none"); forceProps.put("spring.jpa.generate-ddl", false); // 加入到属性源队列最前面,优先级最高 environment.getPropertySources().addFirst(new MapPropertySource("forceJpaDdlProps", forceProps)); } }
- 注册该处理器,在项目的
resources/META-INF/spring.factories文件中添加如下配置:
org.springframework.boot.env.EnvironmentPostProcessor=你的全类名路径.ForceJpaDisableDdlPostProcessor
内容的提问来源于stack exchange,提问作者Neeraj Patel
相关产品推荐
相关产品推荐

