Java 加载批处理XML配置时未找到SpringBean,但在应用程序上下文中可用
这是我的XML配置文件。当我试图加载它时,它给出了一个错误。但是这个bean已经存在于应用程序上下文中,用于获取一些数据,并且工作得非常好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 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);
}
}