Spring Boot中Aerospike与Mongo Bean冲突导致启动失败
问题:Mongo与Aerospike共存时MappingAerospikeConverter Bean注入冲突
应用同时使用Mongo和Aerospike数据库,在创建AerospikeConfig配置类时需要自动装配MappingAerospikeConverter,但启动时出现内部Bean名称冲突,导致构造器参数匹配失败。
错误信息
应用启动失败
描述:
org.springframework.data.aerospike.convert.MappingAerospikeConverter构造器的第1个参数需要单个Bean,但找到3个:
- org.springframework.data.aerospike.convert.CustomConversions:定义为null
- customConversions:由类路径资源[com/spring/rule/engine/config/RuleEngineConfig.class]中的方法'customConversions'定义
- mongoCustomConversions:由类路径资源[org/springframework/boot/autoconfigure/data/mongo/MongoDataConfiguration.class]中的方法'mongoCustomConversions'定义
相关配置代码
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.data.aerospike.cache.AerospikeCacheManager; import org.springframework.data.aerospike.convert.AerospikeTypeAliasAccessor; import org.springframework.data.aerospike.convert.MappingAerospikeConverter; import org.springframework.data.aerospike.mapping.AerospikeMappingContext; import org.springframework.data.mapping.model.SimpleTypeHolder; import com.aerospike.client.AerospikeClient; @EnableAutoConfiguration @Configuration @Import(value = {MappingAerospikeConverter.class, AerospikeMappingContext.class, AerospikeTypeAliasAccessor.class, SimpleTypeHolder.class}) public class AerospikeConfig { @Value("${fs.aerospike.hostName}") private String hostName; @Value("${fs.aerospike.portNumber}") private int port; @Autowired private MappingAerospikeConverter mappingAerospikeConverter; @Bean public AerospikeClient aerospike() { return new AerospikeClient(hostName, port); } @Bean public AerospikeCacheManager cacheManager(AerospikeClient aerospikeClient) { return new AerospikeCacheManager(aerospikeClient, mappingAerospikeConverter); } }
解决方案
问题根源
MappingAerospikeConverter的构造器需要注入CustomConversions类型的Bean,但当前Spring容器中存在3个同类型Bean(Mongo的mongoCustomConversions、自定义的customConversions以及Aerospike默认的未实例化Bean),导致自动装配时无法确定选择哪一个。
修改后的配置代码
import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.aerospike.cache.AerospikeCacheManager; import org.springframework.data.aerospike.convert.AerospikeCustomConversions; import org.springframework.data.aerospike.convert.MappingAerospikeConverter; import org.springframework.data.aerospike.mapping.AerospikeMappingContext; import org.springframework.data.mapping.model.SimpleTypeHolder; import com.aerospike.client.AerospikeClient; @EnableAutoConfiguration @Configuration public class AerospikeConfig { @Value("${fs.aerospike.hostName}") private String hostName; @Value("${fs.aerospike.portNumber}") private int port; @Bean public AerospikeClient aerospike() { return new AerospikeClient(hostName, port); } @Bean public AerospikeCustomConversions aerospikeCustomConversions() { return new AerospikeCustomConversions(SimpleTypeHolder.DEFAULT); } @Bean public AerospikeMappingContext aerospikeMappingContext(AerospikeCustomConversions aerospikeCustomConversions) { AerospikeMappingContext context = new AerospikeMappingContext(); context.setCustomConversions(aerospikeCustomConversions); return context; } @Bean public MappingAerospikeConverter mappingAerospikeConverter(AerospikeMappingContext aerospikeMappingContext, AerospikeCustomConversions aerospikeCustomConversions) { return new MappingAerospikeConverter(aerospikeMappingContext, aerospikeCustomConversions); } @Bean public AerospikeCacheManager cacheManager(AerospikeClient aerospikeClient, MappingAerospikeConverter mappingAerospikeConverter) { return new AerospikeCacheManager(aerospikeClient, mappingAerospikeConverter); } }
关键说明
- 移除原配置中不必要的
@Import,避免Spring自动创建Bean时的依赖混乱 - 新增
aerospikeCustomConversionsBean,明确为Aerospike创建专属的自定义转换实例,彻底避免与Mongo的实例冲突 - 手动创建
AerospikeMappingContext并关联对应的CustomConversions,确保上下文使用正确的转换规则 - 通过
@Bean方法显式构造MappingAerospikeConverter,传入明确的依赖Bean,消除自动装配时的歧义
内容的提问来源于stack exchange,提问作者user3430702
相关产品推荐
相关产品推荐

