Spring Batch项目报错:无法找到org.springframework.batch.core.Job类型Bean
Hey there! Let's break down why you're hitting this error and how to fix it:
核心原因
You added @EnableBatchProcessing to turn on Spring Batch functionality, but you haven't actually defined any concrete Job bean in your application. Spring's dependency injection system tries to inject a Job instance into your DemoApplication class, but there's no such bean registered in the container—this is exactly why you see the "No qualifying bean of type 'org.springframework.batch.core.Job' available" error.
怎么解决
Spring Batch requires you to explicitly define at least one Job, which is composed of one or more Steps (the smallest unit of batch work). Here's a quick way to fix your code:
You can either create a separate configuration class, or add the necessary bean definitions directly in your DemoApplication class. Below is a modified version of your code with a simple, working Job/Step setup:
package com.example.demo; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.PlatformTransactionManager; @SpringBootApplication @EnableScheduling @EnableBatchProcessing public class DemoApplication { @Autowired private JobLauncher jobLauncher; @Autowired private Job job; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Scheduled(cron = "0 */1 * * * ?") public void perform() throws Exception { JobParameters params = new JobParametersBuilder() .addString("JobID", String.valueOf(System.currentTimeMillis())) .toJobParameters(); jobLauncher.run(job, params); } // Define a simple Step that prints a message @Bean public Step sampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) { return new StepBuilder("sampleStep", jobRepository) .tasklet((contribution, chunkContext) -> { System.out.println("Hello from Spring Batch! Scheduled job is running..."); return RepeatStatus.FINISHED; }, transactionManager) .build(); } // Define a Job that uses the sample Step @Bean public Job sampleJob(JobRepository jobRepository, Step sampleStep) { return new JobBuilder("sampleJob", jobRepository) .start(sampleStep) .build(); } }
关键说明
- The
@Beanannotations forStepandJobregister these components in the Spring container, so your@Autowired Job jobwill now have a valid instance to inject. - This example uses a simple
taskletstep (for one-off tasks). Once you're ready to expand, you can replace it with chunk-oriented processing (reading, processing, writing data) for more complex batch jobs.
内容的提问来源于stack exchange,提问作者Faouzeya

