Java 17 Spring应用报错:无法解析spring.jpa.hibernate.ddl-auto占位符求助
可能的原因
Dev Profile未激活
你的DevConfig标注了@Profile("dev"),如果启动应用时未激活dev环境,这个配置类不会被加载,对应的application-dev.properties也不会通过@PropertySource被读取,导致spring.jpa.hibernate.ddl-auto属性不存在。@PropertySource加载顺序冲突
Spring Boot中,手动通过@PropertySource加载的属性文件,加载时机可能晚于Spring Data JPA的自动配置类。当自动配置类尝试读取spring.jpa.hibernate.ddl-auto时,该属性还未被加载到环境中,从而触发占位符解析失败。配置文件未正确打包
虽然你检查了路径,但可能application-dev.properties没有被正确打包到应用的classpath中,导致Spring无法找到该文件。
解决方案
1. 确保激活Dev Profile
启动应用时,通过以下方式之一激活dev环境:
- 添加启动参数:
--spring.profiles.active=dev - 在
application.properties中配置:spring.profiles.active=dev
2. 移除@PropertySource,使用Spring Boot自动配置
Spring Boot会自动识别并加载application-{profile}.properties格式的配置文件,无需手动通过@PropertySource指定。修改DevConfig如下:
@Configuration @Profile("dev") // 移除@PropertySource注解 public class DevConfig { @Autowired private DBService dbService; @Value("${spring.jpa.hibernate.ddl-auto}") private String ddlAuto; @Bean public boolean instanciaDB() { if ("create".equals(ddlAuto)) { dbService.instanciaDB(); } return false; } }
这样Spring Boot会自动加载application-dev.properties,且属性会在自动配置类加载前被注入到环境中。
3. 验证配置文件打包情况
检查项目编译后的target/classes(Maven)或build/classes(Gradle)目录下是否存在application-dev.properties文件。如果不存在,确认文件放置在src/main/resources目录下,且构建工具的资源配置正确。
4. 改用Environment获取属性(可选)
如果仍有问题,可以通过Environment直接获取属性,规避@Value的注入时机问题:
@Configuration @Profile("dev") public class DevConfig { @Autowired private DBService dbService; @Autowired private Environment env; @Bean public boolean instanciaDB() { String ddlAuto = env.getProperty("spring.jpa.hibernate.ddl-auto"); if ("create".equals(ddlAuto)) { dbService.instanciaDB(); } return false; } }
内容的提问来源于stack exchange,提问作者Kaique S. Silva

