弹簧自动连接参数的泛型类型(Spring autowiring parameterized gene

2019-10-19 18:01发布

弹簧4包括重大改进,泛型类型的分辨率,但我有与自动装配泛型类型麻烦时,类型参数是对含有bean类参数。

我需要跟踪提交给外部服务作业的状态,我希望它启动时创建的每个作业的条目并清除或更新它,当我收到的回传。 我一般尽量保持我从服务接口分离的持久性策略,所以我有一个接口JobStatus和弹簧数据蒙戈类MongoJobStatus implements JobStatus 。 由于外部服务都有机会分配一个ID前的作业可能会失败(例如HTTP 502),我需要通过JobStatus回到服务识别更新:

interface JobStatusService<S extends JobStatus> {
    S beginJob(...);
    S updateJobStatus(S targetJob, Status newStatus);
    void finishJob(S targetJob);
}

因此,用于处理发射过的作业和记录回传我的春节控制器看起来像这样; 控制器类中携带的类型参数,这样我可以存储新的状态对象,并将其传递回服务:

@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上下文失败, NoSuchBeanDefinitionExceptionJobStatusService 。 我已经证实,假如我required=false ,则MongoJobStatusService bean是正确的组件扫描和安装的背景下,但春天似乎并不能够理解这个类实现了参数化的通用接口。

有什么办法可以指定到春天,我需要实现与在含有豆级参数,而不是嵌入式的现场级文字类型参数类型参数的通用接口豆?

Answer 1:

尝试添加:

 @Autowired 
 @Qualifier("mongoJobStatusService")
 JobStatusService<JS> jobService;

并指定名称MongoJobStatusService豆。



Answer 2:

Spring容器不会出现,以便能够解决在控制器类可接受的类型的参数,但如果这些类型参数被显式提供它可以解决用于注入领域。 我已经能够用文字型子类控制器类未达最佳的解决此问题:

@Controller
public class MongoJobController<MongoJobStatus> {}

我已经开了一个JIRA问题 ,这和具有在GitHub上一个最小的例子 。



Answer 3:

事实上Spring不会找到符合豆,也许会导致JobStatusService为高电平。

尝试把MongoJobStatusService和JobStatusService之间的其它接口,这样

public class MongoJobStatusService implements IMongoJobStatusService  {
..}

public interface IMongoJobStatusService  implements  JobStatusService<MongoJobStatus> {
...
}

I'had同样的问题( 弹簧自动装配麻烦通用参数 ),和我解决它这样...



文章来源: Spring autowiring parameterized generic types