Spring 4 包括对泛型类型解析的主要增强,但是当类型参数在包含的 bean 类上参数化时,我无法自动装配泛型类型。
我需要跟踪提交给外部服务的作业的状态,并且我想在每个作业启动时为其创建一个条目,并在收到回发时清除或更新它。我通常会尝试将我的持久化策略与服务接口分开,所以我有一个接口JobStatus
和一个 Spring Data Mongo 类MongoJobStatus implements JobStatus
。由于在外部服务有机会为其分配 ID(例如,HTTP 502)之前,作业可能会失败,因此我需要将JobStatus
回传给服务以识别更新:
interface JobStatusService<S extends JobStatus> {
S beginJob(...);
S updateJobStatus(S targetJob, Status newStatus);
void finishJob(S targetJob);
}
因此,我的 Spring 控制器处理启动作业和记录回发看起来像这样;控制器类带有一个类型参数,以便我可以存储新的状态对象并将其传递回服务:
@Controller
public class JobController<JS extends JobStatus> {
@Autowired JobStatusService<JS> jobService;
... handler method ...
JS status = jobService.createJob(info, goes, here);
// submit job via HTTP
jobService.updateJobStatus(status, Status.PROCESSING);
...
}
我的 MongoDB 支持的实现如下所示:
public class MongoJobStatusService implements JobStatusService<MongoJobStatus> {
MongoJobStatus beginJob(...) {...}
MongoJobStatus updateJobStatus(MongoJobStatus job, Status newStatus) {...}
}
当我尝试启动时,Spring 上下文因NoSuchBeanDefinitionException
for失败JobStatusService
。我已经确认,如果我设置required=false
,MongoJobStatusService
bean 会被正确地组件扫描并安装在上下文中,但 Spring 似乎无法理解该类实现了该参数化的通用接口。
有什么方法可以向 Spring 指定我需要一个实现泛型接口的 bean,该接口具有在包含 bean 级别参数化的类型参数,而不是作为字段级别的文字类型参数嵌入?