Spring引导:重复的bean定义名称



当我的服务启动时,我收到了下一条消息:

ConflictingBeanDefinitionException:注释指定的bean名称'estatRegistreServiceImpl'为bean类[cat.gencat. catsalutate . hesi .mpi.api.loader.service.]与现有的同名和类的不兼容bean定义冲突[cat.gencat. catsalutor . hess .mpi.api.admin.service.impl.EstatRegistreServiceImpl]

由以下原因引起:org.springframework.context.annotation.ConflictingBeanDefinitionException:注释指定的bean名称'estatRegistreServiceImpl'用于bean类[cat.gencat. catsalutat . hesi .mpi.api.loader.service.]与现有的同名和类的不兼容bean定义冲突[cat.gencat. catsalutor . hess .mpi.api.admin.service.impl.EstatRegistreServiceImpl]

目前,我已经创建了两个包含我的服务的包:

src/main/java/cat/gencat/catsalut/hes/mpi/api/admin/service/
src/main/java/cat/gencat/catsalut/hes/mpi/api/loader/service/

src/main/java/猫/gencat/catsalut/他/mpi/api/管理/服务/

src/main/java/cat/gencat/catsalut/hes/mpi/api/admin/service/
├── EstatRegistreService.java
├── impl
   ├── EstatRegistreServiceImpl.java

src/main/java/cat/gencat/catsalut/hes/mpi/api/loader/service/
├── EstatRegistreService.java
├── impl
   ├── EstatRegistreServiceImpl.java

两个bean使用相同的名称注册:estatRegistreServiceImpl

我知道我已经能够使用@Service注释设置注册名称。我不想维护这些字符串字面值,因为我有很多类似服务的类。

有没有办法不使用@Service("service1") and@Service("service2) '来获得它?

感谢

您可以创建一个自定义bean名称生成器。它将在注册bean时添加完整的限定符路径。

这里我实现了ApplicationRunner接口,只是为了说明bean名称将是什么!

@SpringBootApplication
@ComponentScan(nameGenerator = YourMainApplication.CustomGenerator.class)
public class YourMainApplication extends SpringBootServletInitializer implements ApplicationRunner {
@Autowired
private ApplicationContext context;
public static void main(String[] args) {
SpringApplication.run(YourMainApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(YourMainApplication.class);
}
public static class CustomGenerator extends AnnotationBeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
return definition.getBeanClassName();
}
}
@Override
public void run(ApplicationArguments args) {
String[] allServiceBeansNames = context.getBeanNamesForAnnotation(Service.class);
for(String beanName : allServiceBeansNames) {
System.out.println(beanName);
}
}
}

最新更新