gpt4 book ai didi

java - Spring:Spring Batch bean 的 DI 不起作用

转载 作者:行者123 更新时间:2023-11-30 08:42:23 25 4
gpt4 key购买 nike

我想从一个上下文中将一个 bean 注入(inject)到 MVC 上下文中的 Controller bean 中。这是我在 MVC 上下文中的 bean 定义:

<import resource="another.context.xml"/>

<bean name="myController" class="com.test.spring.web.Controller">
<property name="batchJobRepository" ref="batchJobRepository"/>
</bean>

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

<bean id="batchJobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
</bean>

我的 Controller :

@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!";
}

这个问题很棘手。我收到一个错误:

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'myController' defined in class path resource [META-INF/spring/controllers.xml]:
Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException:
Failed to convert property value of type 'com.sun.proxy.$Proxy25 implementing org.springframework.batch.core.repository.JobRepository,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean' for property 'batchJobRepository';
nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy25 implementing org.springframework.batch.core.repository.JobRepository,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean] for property 'batchJobRepository': no matching editors or conversion strategy found

我该如何解决?

UPD

添加了 Controller 详细信息。

UPD2

我试过

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

batchJobRepository bean 中。但结果是一样的:Failed to convert property value of type 'com.sun.proxy.$Proxy17 implementing org.springframework.batch.core.repository.JobRepository

最佳答案

这个问题是因为您错误地使用了 MapJobRepositoryFactoryBean 造成的。这个 bean 实际上是一个工厂 bean,它将返回 JobRepository 的实例。

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

将您的 Controller 代码更改为以下内容:

@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,如下所示:

<bean id="jobExplorer" 
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="myController" class="com.test.spring.web.Controller">
<property name="jobExplorer" ref="jobExplorer"/>
</bean>

然后像这样在 Controller 中使用 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!";
}
}

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

关于java - Spring:Spring Batch bean 的 DI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583079/

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