Java Spring加载了一个bean,但无法通过Autowire或ApplicationContextAware获取它

Java Spring加载了一个bean,但无法通过Autowire或ApplicationContextAware获取它,java,spring,spring-mvc,jakarta-ee,spring-batch,Java,Spring,Spring Mvc,Jakarta Ee,Spring Batch,我有一个bean,它以postConstruct方法加载Spring批处理配置XML: @PostConstruct private void starter(){ String[] springConfig = { "SpringBatch/override/application-context.xml", "SpringBatch/override/database.xm

我有一个bean,它以postConstruct方法加载Spring批处理配置XML:

    @PostConstruct
    private void starter(){            
        String[] springConfig = {
                "SpringBatch/override/application-context.xml",
                "SpringBatch/override/database.xml",
                "SpringBatch/jobs/job-dataExtraction.xml",
        };   


        ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
    }
}
我正在使用计时器检查数据库条目并启动作业。计时器正在另一个类中调用下面的方法

public static void startUnidataJob(MessageDTO<String> msgDto){

        JobLauncher jobLauncher = (JobLauncher) ApplicationContextProvider.getApplicationContext().getBean("jobLauncher");  //Problem occurs here

            Job job = (Job) ApplicationContextProvider.getApplicationContext().getBean("dataExtractionJob");


            try {
                logger.info("With in starting...........................");
                JobExecution execution = jobLauncher.run(job, new JobParameters());

            } catch (Exception e) {
                logger.error("Job launching Exception : ", e);
            }
        }
    }
以下是ApplicationContextProvider的代码

@Component
public class ApplicationContextProvider implements ApplicationContextAware{

    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
下面是通过ClassPathXmlApplicationContext加载的application-context.xml

<bean id="jobLauncher"
        class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor">
            <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
        </property>
    </bean>

    <!-- Must set this -->
    <bean
        class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
        <property name="jobRegistry" ref="jobRegistry" />
    </bean>

    <bean id="jobRegistry"
        class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

    <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>

奇怪的是,我的本地应用程序运行良好。 在服务器中,我运行了两个相同的spring批处理java应用程序。
有人能帮我吗?

我认为没有必要使用
ApplicationContextProvider
。您可以将作业和jobLauncher注入定义了
startUnidataJob
的类中。例如:

public class JobScheduler {

    private static final Logger logger = LoggerFactory.getLogger(JobScheduler.class.getName());

    private Job job;

    private JobLauncher jobLauncher;

    public JobScheduler(Job job, JobLauncher jobLauncher) {
        this.job = job;
        this.jobLauncher = jobLauncher;
    }

    public void startUnidataJob(MessageDTO<String> msgDto) {
        try {
            logger.info("With in starting...........................");
            JobExecution execution = jobLauncher.run(job, new JobParameters());
        } catch (Exception e) {
            logger.error("Job launching Exception : ", e);
        }
    }
}
公共类作业调度器{
私有静态最终记录器Logger=LoggerFactory.getLogger(JobScheduler.class.getName());
私人工作;
私有JobLauncher JobLauncher;
公共JobScheduler(作业作业,JobLauncher JobLauncher){
这个工作=工作;
this.jobLauncher=jobLauncher;
}
public void startUnidataJob(MessageDTO-msgDto){
试一试{
logger.info(“启动中有……”);
JobExecution=jobLauncher.run(作业,新作业参数());
}捕获(例外e){
logger.error(“作业启动异常:”,e);
}
}
}
您可以在应用程序上下文中将此组件声明为bean,它将被注入作业和jobLauncher。然后在适当的时候使用它来启动作业


希望这有帮助。

您确定jobLauncher已创建吗?“jobRepository”是在哪里创建的?描述具体问题请参阅我的整个帖子。我已经提到了@TarunWhy,你不只是将依赖注入到那个类中,而是使用这个装置吗?通常,当恢复到基于
ApplicationContextProvider
的解决方案时,您的做法是错误的。我尝试过@Autowired,但它无法注入JobLauncher。它仍然是空的@M
public class JobScheduler {

    private static final Logger logger = LoggerFactory.getLogger(JobScheduler.class.getName());

    private Job job;

    private JobLauncher jobLauncher;

    public JobScheduler(Job job, JobLauncher jobLauncher) {
        this.job = job;
        this.jobLauncher = jobLauncher;
    }

    public void startUnidataJob(MessageDTO<String> msgDto) {
        try {
            logger.info("With in starting...........................");
            JobExecution execution = jobLauncher.run(job, new JobParameters());
        } catch (Exception e) {
            logger.error("Job launching Exception : ", e);
        }
    }
}