gpt4 book ai didi

java - 由于多个可能的 bean,Spring Boot Autowiring 泛型失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:33 25 4
gpt4 key购买 nike

我正在尝试创建一个 Autowiring 类型 T 对象的类。

@component    
public class TaskScheduler<T extends TaskService>{
@Autowired
private T taskService;
}

问题是我有两个扩展 TaskService 的组件。

@component
public class firstTaskService extends TaskService {

}

@component
public class secondTaskService extends TaskService {

}

所以当这一行被执行时(ts 正在被创建)

@Autowired
TaskScheduler<firstTaskService> ts;

我收到这个错误:

Description: Parameter 1 of constructor in TaskScheduler required a single bean, but 2 were found

我收到的消息是这样建议的:

Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed.

但据我了解,@Primary@Qualifier 注释让我选择了其中一个组件,这不是我想要的,因为我想使用 firstTaskServicesecondTaskService 具有相同的类 (TaskScheduler)。

这是怎么做到的?

编辑: 说明:我的目标是将 TaskScheduler 类与扩展 TaskService 类的不同类重用(不使用多个类在 TaskScheduler 中一起扩展 TaskService

最佳答案

如果您想 Autowiring 所有扩展 TaskService 的 bean,也许您应该将 Autowiring 字段更改为 List:

@Component    
public class TaskScheduler<T extends TaskService>{
@Autowired
private List<T> taskService;
}

通过这种方式,Spring 应该将所有扩展 TaskService 的 Autowiring bean 放入 List 中。

编辑:由于您想动态选择 TaskService 的类型,我发现的唯一方法如下。首先,重新定义您的 TaskScheduler:

public class TaskScheduler <T extends TaskService>{

private T taskService;

public void setTaskService(T taskService) {
this.taskService = taskService;
}
}

您的 TaskService 和相关的子类应该保持不变。设置一个配置类如下:

@Configuration
public class TaskConf {

@Autowired
private FirstTaskService firstTaskService;

@Autowired
private SecondTaskService secondTaskService;

@Bean
public TaskScheduler<FirstTaskService> firstTaskServiceTaskScheduler(){
TaskScheduler<FirstTaskService> t = new TaskScheduler<>();
t.setTaskService(firstTaskService);
return t;
}

@Bean
public TaskScheduler<SecondTaskService> secondTaskServiceTaskScheduler(){
TaskScheduler<SecondTaskService> t = new TaskScheduler<>();
t.setTaskService(secondTaskService);
return t;
}

}

然后以这种方式测试您的 TaskScheduler:

@Autowired
TaskScheduler<firstTaskService> ts;

关于java - 由于多个可能的 bean,Spring Boot Autowiring 泛型失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54790110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com