Hibernate配置中@Autowired Environment空指针异常(NPE)修复
嘿,我仔细看了你的代码,发现几个关键问题,这应该就是导致NPE的根源,咱们一步步来修复:
1. 最致命的错误:把属性值当成属性键传入env.getProperty()
你现在犯了一个很低级但影响巨大的错误——直接把驱动类名、数据库URL这些属性值当成了env.getProperty()的参数,但这个方法需要的是hibernate.properties文件里定义的属性键啊!
举个例子,你的hibernate.properties应该是这样写的:
# 数据库连接相关配置 jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/tutorialdb?createDatabaseIfNotExist=true jdbc.username=root jdbc.password=9339 # Hibernate核心配置 hibernate.hbm2ddl.auto=create-drop hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
然后对应的dataSource()方法要改成用键来获取值:
@Bean public DataSource dataSource() { final BasicDataSource dataSource = new BasicDataSource(); // 用属性键获取值,而不是直接传值 dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.username"))); dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.password"))); return dataSource; }
同样,hibernateProperties()方法也要修正:
private final Properties hibernateProperties() { final Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); return hibernateProperties; }
2. 确认属性文件的加载路径
你用了@PropertySource({ "classpath:hibernate.properties" }),要确保这个文件确实在src/main/resources目录下(Maven/Gradle项目的默认资源目录)。如果文件放错位置,Spring加载不到属性,env里自然没有对应值,也会触发Preconditions.checkNotNull()抛出异常(看起来像NPE,但实际是属性不存在)。
3. 确保配置类被Spring扫描到
如果是Spring Boot项目,主类上的@SpringBootApplication默认会扫描主类所在包及其子包。如果你的HibernateConf在其他包,记得在主类上添加@ComponentScan(basePackages = "你的配置类所在包路径"),不然Spring根本不会初始化这个配置类,env自然是null。
4. 修复小细节问题
sessionFactory.setPackagesToScan(new String[]{"Enteties"})里的包名拼写错误,应该是"Entities"(少了一个't'),不然Hibernate找不到你的实体类。
最后验证
改完这些之后重启应用,应该就能解决NPE问题了:Spring会正确加载属性文件到Environment,env.getProperty()能拿到对应的值,Hibernate的SessionFactory和DataSource也能正常初始化。
内容的提问来源于stack exchange,提问作者Arthur Dyachenko

