Spring Boot读application.properties连Cassandra报空指针异常如何解决
问题原因
- 手动实例化配置类导致配置注入失效:两处手动
new CassandraConfig的操作(DataSourceCassandraConfig里的new CassandraConfig()、CassandraConfig的cluster()方法里的new CassandraConfig())生成的实例不受Spring容器管理,@Value标注的属性不会被自动赋值,全部为null。 - 配置项缺失:application.properties中未配置代码里引用的
spring.data.cassandra.basePackages、spring.data.cassandra.username、spring.data.cassandra.password三个配置项,即使Spring注入也会出现空值。 - 方法名拼写错误:DataSourceCassandraConfig中调用了
cassandraConfig.getUserName(),但CassandraConfig类里对应方法名为getUsername()(u小写),会导致编译异常或取值失败。 - DataSourceCassandraConfig未被Spring托管:如果该类没有加
@Configuration或@Component注解,即使使用@Autowired也无法注入CassandraConfig实例。
修复步骤
- 删除CassandraConfig类中错误的cluster() Bean定义,无需手动创建CassandraConfig实例,该类本身由Spring托管会自动注入配置值。
- 补全application.properties中的缺失配置:
# 替换为你项目实际的实体类包路径 spring.data.cassandra.basePackages=br.com.myapp.entity # 替换为你Cassandra实际的账号密码,默认安装的账号密码均为cassandra spring.data.cassandra.username=cassandra spring.data.cassandra.password=cassandra
- 改造DataSourceCassandraConfig类,添加
@Configuration注解使其被Spring托管,直接注入CassandraConfig实例,移除手动new的逻辑,修正方法名拼写:
@Configuration public class DataSourceCassandraConfig { @Autowired private CassandraConfig cassandraConfig; @Bean public SparkSession getSession() { SparkSession spark = SparkSession.builder().appName("SparkCassandraApp") .config("spark.cassandra.connection.host", cassandraConfig.getContactPoints()) .config("spark.cassandra.connection.port", cassandraConfig.getPort()) .config("spark.cassandra.auth.username", cassandraConfig.getUsername()) .config("spark.cassandra.auth.password", cassandraConfig.getPassword()) .master("local[2]").getOrCreate(); return spark; } }
内容的提问来源于stack exchange,提问作者Luciana Oliveira
相关产品推荐
相关产品推荐

