首页 > 解决方案 > 泛型的 Spring 嵌套自动装配抛出 NoUniqueBeanDefinitionException

问题描述

是否可以在构造函数中将泛型类型自动装配为不同的泛型类型?我目前有这样的结构:

@Service
public class ExampleService {
@Autowired
ServiceA<Integer> servicea;

}

和服务:

@Component
@Scope(SCOPE_PROTOTYPE)
public class ServiceA<S> {
  private final ServiceB<S,String> dependentServiceB;

  public ServiceA (ServiceB<S,String> dependentServiceB){
     this.dependentServiceB = dependentServiceB;
  }
}

@Configuration
public class ServiceBConfig {
  @Bean
  ServiceB<Integer,String> serviceBwithInt (){
      return new ServiceBImplInt();
  }

  @Bean
  ServiceB<Long,String> serviceBwithLong (){
      return new ServiceBImplLong();
  }

}

现在,如果我尝试在其他地方自动装配 ExampleService 类,它会抛出一个 NoUniqueBeanDefinitionException,其中包含“没有 '....ServiceB< ? >' 类型的合格 bean:预期的单个匹配 bean,但找到了 2:serviceBwithInt,serviceBwithLong”。

这是否可以像这样解决它,还是我必须为每个不同的泛型类型实现 ServiceA 的子类?

标签: javaspring

解决方案


考虑到类型擦除的工作原理,这两个 bean 都可以被注入,因为Java会接受这两个作为构造函数的有效参数。

如果您想明确说明注入的内容,请使用@Qualifier.

@Component
@Scope(SCOPE_PROTOTYPE)
public class ServiceA<S> {
  private final ServiceB<S,String> dependentServiceB;

  public ServiceA (@Qualifier("serviceBWithInt")ServiceB<S,String> dependentServiceB){
     this.dependentServiceB = dependentServiceB;
  }
}

如果您不能明确说明您想要哪个 bean,您可能需要重新考虑在此处添加泛型。首先有一些利基原因想要这样做,并且依赖注入的流程仍然是完全可预测的,即使您不控制对象的生命周期。


推荐阅读