继承AbstractCassandraConfiguration后application.yml自动配置失效如何解决
问题根本原因
Spring Boot 提供的CassandraAutoConfiguration、CassandraDataAutoConfiguration自动配置类均带有@ConditionalOnMissingBean(type = "org.springframework.data.cassandra.config.AbstractCassandraConfiguration")条件,一旦你自定义类继承了AbstractCassandraConfiguration或其 reactive 子类AbstractReactiveCassandraConfiguration,自动配置就会停止加载,导致application.yml中的配置失效。
方案1:无需继承AbstractCassandraConfiguration(优先推荐)
Spring Boot 2.x 版本原生支持自定义Cassandra转换器,你只需要直接向容器注册CassandraCustomConversions类型的Bean即可,自动配置会自动识别并使用该Bean,同时完全保留yml配置的加载逻辑。
操作步骤
- 定义自定义转换器
// 自定义读转换器示例 public class CustomReadConverter implements Converter<LocalDate, YourCustomType> { @Override public YourCustomType convert(LocalDate source) { // 实现你的转换逻辑 } } // 自定义写转换器示例 public class CustomWriteConverter implements Converter<YourCustomType, LocalDate> { @Override public LocalDate convert(YourCustomType source) { // 实现你的转换逻辑 } }
- 注册
CassandraCustomConversionsBean
在任意@Configuration修饰的配置类中添加如下Bean定义即可:
import org.springframework.boot.autoconfigure.data.cassandra.CassandraCustomConversions; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; @Configuration public class CassandraConverterConfig { @Bean public CassandraCustomConversions cassandraCustomConversions() { // 把你所有自定义的转换器加入列表即可 List<?> converters = List.of( new CustomReadConverter(), new CustomWriteConverter() ); return new CassandraCustomConversions(converters); } }
该方案无需修改原有配置逻辑,application.yml中的所有Cassandra配置完全生效,自定义转换器也会被正常加载。
方案2:必须继承AbstractReactiveCassandraConfiguration的兼容方案
如果你有其他需求必须继承配置类,可通过注入Spring Boot自动加载的CassandraProperties属性类,手动绑定yml配置,避免自己硬编码配置值。
操作示例
import org.springframework.boot.autoconfigure.cassandra.CassandraProperties; import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.AbstractReactiveCassandraConfiguration; import org.springframework.data.cassandra.core.convert.CassandraCustomConversions; import java.util.List; @Configuration public class CustomCassandraConfig extends AbstractReactiveCassandraConfiguration { private final CassandraProperties cassandraProperties; // 注入自动加载的配置属性类 public CustomCassandraConfig(CassandraProperties cassandraProperties) { this.cassandraProperties = cassandraProperties; } // 重写对应配置方法,全部从properties中读取 @Override protected String getKeyspaceName() { return cassandraProperties.getKeyspaceName(); } @Override protected String getContactPoints() { return String.join(",", cassandraProperties.getContactPoints()); } @Override protected int getPort() { return cassandraProperties.getPort(); } @Override protected String getUsername() { return cassandraProperties.getUsername(); } @Override protected String getPassword() { return cassandraProperties.getPassword(); } // 其他你在yml中配置的属性,都可以按照对应方法重写返回properties中的值 // 配置自定义转换器 @Override public CassandraCustomConversions customConversions() { List<?> converters = List.of( new CustomReadConverter(), new CustomWriteConverter() ); return new CassandraCustomConversions(converters); } }
注意:你使用的是reactive版本的starter,必须继承AbstractReactiveCassandraConfiguration而非普通的AbstractCassandraConfiguration,否则reactive相关的操作组件不会被自动注册。
内容的提问来源于stack exchange,提问作者Raj

