Java Spring:Spring批处理bean的DI不工作

Java Spring:Spring批处理bean的DI不工作,java,spring,dependency-injection,spring-batch,Java,Spring,Dependency Injection,Spring Batch,我想在MVC上下文中将一个bean从一个上下文注入到我的控制器bean中。以下是我在MVC上下文中的bean定义: 在另一个上下文中,我定义了一个Spring批处理作业存储库: 我的控制器: @Controller public class MyController { private MapJobRepositoryFactoryBean batchJobRepository; @RequestMapping("/batch/test") @ResponseB

我想在MVC上下文中将一个bean从一个上下文注入到我的控制器bean中。以下是我在MVC上下文中的bean定义:


在另一个上下文中,我定义了一个Spring批处理作业存储库:


我的控制器:

@Controller
public class MyController {
    private MapJobRepositoryFactoryBean batchJobRepository;

    @RequestMapping("/batch/test")
    @ResponseBody
    public String batch() {
            Set<JobExecution> jes = batchJobRepository
                .getJobExecutionDao()
                .findRunningJobExecutions("firstJob");

            for (JobExecution je : jes) {
                System.out.println(je.isRunning());
            }
            return "Done!";
    }
我怎样才能修好它

UPD

添加了控制器详细信息

UPD2

我试着用

<aop:scoped-proxy proxy-target-class="true"/>


batchJobRepository
bean中。但结果是相同的:
未能转换'com.sun.proxy.$Proxy17实现org.springframework.batch.core.repository.JobRepository'类型的属性值。您应该在DI上使用anotation
@Autowired

@Autowired
    private MapJobRepositoryFactoryBean batchJobRepository;
还可以在spring上下文中添加以下行:

<!--AUTOWIRED-->
<context:component-scan base-package="com.system.rest.app.controller" /> 

导致此问题的原因是您不正确地使用了
MapJobRepositoryFactoryBean
。这个bean实际上是一个工厂bean,它将返回
JobRepository
的实例

stacktrace本质上是说它不能将
JobRepository
类型的bean强制转换为
MapJobRepositoryFactoryBean
,并在控制器中设置属性。还应注意,
MapJobRepositoryFactoryBean
是一个纯内存实现,不会连接到数据库来管理作业状态

将控制器代码更改为以下内容:

@Controller
public class MyController {
    private JobRepository batchJobRepository;

    @RequestMapping("/batch/test")
    @ResponseBody
    public String batch() {
        Set<JobExecution> jes = batchJobRepository
            .getJobExecutionDao()
            .findRunningJobExecutions("firstJob");
        for (JobExecution je : jes) {
            System.out.println(je.isRunning());
        }
        return "Done!";
    }
}
然后在控制器中使用
JobExplorer
bean,如下所示:

@Controller
public class MyController {
    private JobExplorer jobExplorer;

    @RequestMapping("/batch/test")
    @ResponseBody
    public String batch() {
        Set<JobExecution> jes = jobExplorer
            .findRunningJobExecutions("firstJob");
        for (JobExecution je : jes) {
            System.out.println(je.isRunning());
        }
        return "Done!";
    }
}
@控制器
公共类MyController{
私人JobExplorer;
@请求映射(“/batch/test”)
@应答器
公共字符串批处理(){
Set jes=jobExplorer
.findRunningJobExecutions(“第一份工作”);
用于(作业执行je:jes){
System.out.println(je.isRunning());
}
返回“完成!”;
}
}

我不知道为什么您认为将aop配置设置为使用Aspect-J会有所帮助,但这不会有帮助,如果不需要,您不应该使用加载时编织。

您可以发布所有类控制器吗?当然可以。看我的更新,我不明白。为什么控制器类既有
@Controller
注释,又有相应的
声明?另外,为什么要尝试注入一个
FactoryBean
bean而不是工厂创建的实际对象?这本身并不能解决问题。如果使用自动布线,OP仍将获得相同的堆栈跟踪。