首页 > 解决方案 > 批处理配置中的 UnsatisfiedDependencyException

问题描述

我的批处理配置中有 UnsatisfiedDependencyException,我无法解决自动装配的问题。

public class BatchConfigDemande {

    private static final Logger logger = LoggerFactory.getLogger(BatchConfigDemande.class);
    public static final String APPLICATION_CONTEXT = "APPLICATION_CONTEXT";

    private static final String PROPERTY_CSV_EXPORT_FILE_HEADER = "database.to.csv.job.export.file.header";
    private static final String PROPERTY_CSV_EXPORT_FILE_PATH = "database.to.csv.job.export.file.path";

    @Autowired

    @Qualifier("postgresJdbctemplate")
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    XADatasourceConfiguration dataSource;

    /**
     * @param jobRegistry
     * @return
     */

    @Bean
    public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) {
        JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = new JobRegistryBeanPostProcessor();
        jobRegistryBeanPostProcessor.setJobRegistry(jobRegistry);
        return jobRegistryBeanPostProcessor;
    }

    /**
     * @param executor
     * @param jobRepository
     * @return
     * @throws Exception
     */

    @Bean
    public JobLauncher jobLauncher(@Qualifier("taskExecutorForBatchJobs") TaskExecutor executor,
            JobRepository jobRepository) throws Exception {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        jobLauncher.setTaskExecutor(executor);
        jobLauncher.afterPropertiesSet();
        return jobLauncher;
    }

    /**
     * @return
     */

    @Bean(name = "threadPoolTaskExecutor")

    @Qualifier("taskExecutorForBatchJobs")
    public TaskExecutor getAsyncExecutor() {
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();

        poolTaskExecutor.setQueueCapacity(100000);

        poolTaskExecutor.setCorePoolSize(5);

        poolTaskExecutor.setMaxPoolSize(100);

        poolTaskExecutor.setKeepAliveSeconds(2);

        return poolTaskExecutor;
    }



    /**
     * @param databaseCsvItemReader
     * @param databaseCvsitemProcessor
     * @param databasetoCsvItemWriter
     * @param stepBuilderFactory
     * @return stepBuilderFactory
     */

    @Bean
    public Step databaseToCsvStep(ItemReader<Demande> databaseCsvItemReader,
            DemandeItemProcessor databaseCvsitemProcessor, ItemWriter<Demande> databasetoCsvItemWriter,
            StepBuilderFactory stepBuilderFactory) {

        logger.debug("Configuration Step: " + BatchConstants.STEP_NAME);
        return stepBuilderFactory.get(BatchConstants.STEP_NAME).<Demande, Demande>chunk(50)
                .reader(databaseCsvItemReader).processor(databaseCvsitemProcessor).writer(databasetoCsvItemWriter)
                .build();

    }



    /**
     * @param jobBuilderFactory
     * @param csvDemandeStep
     * @return
     */

    @Bean
    Job demandeToCsvJob(JobBuilderFactory jobBuilderFactory,

            @org.springframework.beans.factory.annotation.Qualifier(BatchConstants.STEP_NAME) Step csvDemandeStep) {

        logger.debug("Processing Job:" + BatchConstants.JOB_NAME);
        return jobBuilderFactory.get(BatchConstants.JOB_NAME).incrementer(new RunIdIncrementer())
                .listener(new JobCompletionNotificationListener(jdbcTemplate)).flow(csvDemandeStep).end().build();      
    }
}

创建作业时会出现问题。

造成的:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为 'demandeToCsvJob' 在 com.transactis.qpt.practis.batch.config.BatchConfigDemande 中定义的 bean 时出错:通过方法 'demandeToCsvJob' 参数表示的不满足的依赖关系 1:没有符合条件的 bean 类型[org.springframework.batch.core.Step] 找到依赖项 [org.springframework.batch.core.Step]:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Qualifier(value=processingStep)}; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项 [org.springframework.batch.core.Step] 找到类型为 [org.springframework.batch.core.Step] 的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Qualifier(value=processingStep)}

请帮我

标签: springmodel-view-controllerautowired

解决方案


问题是@Bean public Step databaseToCsvStep()具有 name databaseToCsvStep(与方法名称相同),并且您正在尝试使用 name 注入 bean BatchConstants.STEP_NAME

解决方案是:

要么重命名方法databaseToCsvStep以匹配BatchConstants.STEP_NAME

或删除@Qalifier(BatchConstants.STEP_NAME)注释,

或将bean名称添加到注释@Bean(BatchConstants.STEP_NAME) public Step databaseToCsvStep()


推荐阅读