Java ClassCastException是由Spring boot启动批处理作业时将JobRepositoryFactoryBean强制转换为JobRepository引起的

Java ClassCastException是由Spring boot启动批处理作业时将JobRepositoryFactoryBean强制转换为JobRepository引起的,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,原因:org.springframework.beans.BeanInstantiationException:未能实例化 [org.springframework.batch.core.configuration.annotation.JobBuilderFactory]: 工厂方法“jobBuilders”引发异常;嵌套异常是 java.lang.ClassCastException: org.springframework.batch.core.repository.support.Job

原因:org.springframework.beans.BeanInstantiationException:未能实例化 [org.springframework.batch.core.configuration.annotation.JobBuilderFactory]: 工厂方法“jobBuilders”引发异常;嵌套异常是 java.lang.ClassCastException:

org.springframework.batch.core.repository.support.JobRepositoryFactoryBean$$EnhancerBySpringCGLIB$$ba801bb9

不能投靠 org.springframework.batch.core.repository.JobRepository 位于org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:185) 位于org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ... 省略18个公共框架 原因:java.lang.ClassCastException:org.springframework.batch.core.repository.support.JobRepositoryFactoryBean$$EnhancerBySpringCGLIB$$ba801bb9 不能投靠 org.springframework.batch.core.repository.JobRepository 位于org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$$EnhancerBySpringCGLIB$$9641e37a.jobRepository() 位于org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration.jobBuilders(AbstractBatchConfiguration.java:59) 位于org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$$EnhancerBySpringCGLIB$$9641e37a.CGLIB$jobBuilders$8() 位于org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$$EnhancerBySpringCGLIB$$9641e37a$$FastClassBySpringCGLIB$$19E6f16lang1024 ca.invoke() 位于org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) 位于org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) 位于org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$$EnhancerBySpringCGLIB$$9641e37a.jobBuilders()


尝试使用Spring Boot运行批处理作业

@SpringBootApplication
@Import(value = {BatchJobConfig.class, AJobConfig.class})
@ImportResource("classpath:META-INF/spring/batch-context.xml")
public class MyApp {

    /**
     * @param args
     */
    public static void main(final String[] args) {
        SpringApplication.run(MyApp.class);
    }

}
试图使AJobConfig成为DefaultBatchConfigurer的子类,但实际上不起作用。 不知何故,无论是否添加@EnableBatchProcessing,都会发生此错误。 已尝试将@EnableBatchProcessing添加到MyApp.java和AJobConfig.java

如果有人能帮我指出我是否遗漏了什么,我将不胜感激

我使用的是Spring boot 2.1.8、Spring batch 4.1.2、Spring 5.1.6


batch-context.xml只定义了一个占位符

<context:property-placeholder location="classpath:/config/my-batch*.properties"/>

在阅读了几遍下面的链接后,我终于找出了问题的原因。

问题是在XMLBean定义(批处理:作业存储库)中有一个名为jobRepository的文件。使用@EnableBatchProcessing,我相信这不是必需的。此外,这可能会导致Spring boot自动配置出现问题


删除bean定义将解决所描述的问题

请分享
BatchJobConfig
AJobConfig
的代码。我已经附加了两个简单的配置bean,并描述了xml内容中的内容。这可能与pom.xml中的依赖项有关。相同的配置可以在一个项目中运行,但在另一个项目中描述了错误。maven依赖可能触发了Spring引导配置中的某些进程。将配置从src/test移动到src/main会导致查找数据源的错误。当移动到main/java时,必须提供db依赖项,否则将导致查找数据源的错误。这可以通过将HSQLDB驱动程序作为编译范围而不是测试范围添加到类路径中来解决。
<context:property-placeholder location="classpath:/config/my-batch*.properties"/>
@Autowired
protected JobBuilderFactory jobBuilderFactory;

@Autowired
protected StepBuilderFactory stepBuilderFactory;