Java 加载批处理XML配置时未找到SpringBean,但在应用程序上下文中可用

Java 加载批处理XML配置时未找到SpringBean,但在应用程序上下文中可用,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,这是我的XML配置文件。当我试图加载它时,它给出了一个错误。但是这个bean已经存在于应用程序上下文中,用于获取一些数据,并且工作得非常好 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sch

这是我的XML配置文件。当我试图加载它时,它给出了一个错误。但是这个bean已经存在于应用程序上下文中,用于获取一些数据,并且工作得非常好

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd   ">
    <description>Batch Configuration</description>
    <property-placeholder
        xmlns="http://www.springframework.org/schema/context"
        location="./analytics-config.properties" />
    <bean class="org.springframework.batch.core.scope.StepScope" />
    <bean
        class="com.intellect.riskanalytics.batch.jobs.instruments.InstrumentsReader"
        id="instrumentReader" scope="step">
        <property name="dataService" ref="dataService" />
        <property name="stepExecution" value="#{stepExecution}" />
    </bean>
    <bean
        class="com.intellect.riskanalytics.batch.jobs.instruments.InstrumentsProcessor"
        id="instrumentProcessor">
        <constructor-arg index="0" ref="dataService" />
    </bean>
    <bean
        class="com.intellect.riskanalytics.batch.jobs.instruments.DurationsWriter"
        id="durationsWriter" scope="step">
        <property name="dataService" ref="dataService" />
        <property name="stepExecution" value="#{stepExecution}" />
    </bean>
    <job xmlns="http://www.springframework.org/schema/batch" id="durationsJob">
        <step id="abstractIsinDurationsStep">
            <tasklet>
                <chunk commit-interval="${batch.writer.chunk-size}"
                    processor="instrumentProcessor" reader="instrumentReader"
                    writer="durationsWriter" />
            </tasklet>
        </step>
    </job>
</beans>


Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dataService' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1213)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 30 more

谢谢。

的评论给了我一个解决方案。无论是
ImportResource
还是在应用程序启动后手动加载XML,应用程序上下文都为空。当它加载到
CommandLineRunner
run()
方法中时,它就工作了。我认为在
CommandLineRunner
实现完成之前,应用程序上下文还没有完全准备好

我不明白你所说的“你的bean已经存在”是什么意思,我看到的只是一个
applicationContext
文件,它引用的是一个未定义的bean。在我看来,这个错误是合法的。好吧,在您的配置文件中,没有
dateService
bean,也没有
jdbcTemplate
。因此,在我看来,实例化一个引用了
jdbcTemplate
的bean会抛出一个错误是合法的。@YassineBadache我想我需要弄清楚。加载XML配置时,spring boot从属性文件创建并自动连接的bean是否不可用??因为这些beans数据服务、jdbcTemplate在加载这个文件之前很久就被使用了,所以我没有遇到任何问题。我无法找到源代码,也无法肯定地告诉您“情况就是这样”,但我认为情况就是这样:代码中自动连接的bean在.xml配置中无法作为引用,尤其是在手动加载它的情况下。再一次,这不是断言,我希望有人确认和/或证明/反驳这一点。@JoeriHendrickx在启动应用程序时,bean数据服务是自动连接的,我可以在localhost:8080/beans创建的bean列表中看到它。即使我这样做,
,那就是说JDBCTemplatebean不可用
import java.util.Arrays;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.intellect.riskanalytics.util.Logger;

/**
 * Startup class for launching the application by Spring Boot
 *
 * @see SpringBootApplication
 * @see EnableBatchProcessing
 * @see EnableCaching
 * @since 1.0
 */
@SpringBootApplication
@EnableBatchProcessing
@EnableCaching
@ImportResource("classpath:analytics-batch-test.xml")
public class AnalyticsApplication {
    private static final Logger logger = new Logger(AnalyticsApplication.class);

    @Autowired
    private static ApplicationContext applicationContext;

    /**
     * Main method to be executed for starting the application in spring context
     *
     * @param args
     *            the command line arguments if any
     */
    public static void main(String[] args) {
        logger.info("Starting Risk Analytics Application With Arguments:" + Arrays.toString(args));
        SpringApplication.run(RiskAnalyticsApplication.class, args);
        logger.info("Started Risk Analytics Application");
        createBatchJobsContext("");
    }

    private static void createBatchJobsContext(String batchXMLLocation) {
        batchXMLLocation = "classpath:riskanalytics-batch-test.xml";
        logger.info("Creating Batch XML Application Context with: " + batchXMLLocation);
        // Tried this
        ApplicationContext batchXMLContext = new ClassPathXmlApplicationContext(new String[] { batchXMLLocation },
                applicationContext);
        // And this
        ApplicationContext batchXMLContext = new ClassPathXmlApplicationContext(batchXMLLocation);

        logger.info("Created Batch application context: " + batchXMLContext);
    }
}