Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring启动应用程序上下文干扰单独的ClassPathXmlApplicationContext_Java_Spring_Spring Boot_Spring Context - Fatal编程技术网

Java Spring启动应用程序上下文干扰单独的ClassPathXmlApplicationContext

Java Spring启动应用程序上下文干扰单独的ClassPathXmlApplicationContext,java,spring,spring-boot,spring-context,Java,Spring,Spring Boot,Spring Context,因为我必须使用遗留应用程序,所以我希望使用来自单独Spring上下文的bean 我使用如下XML beans定义创建了这个单独的Spring上下文: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/

因为我必须使用遗留应用程序,所以我希望使用来自单独Spring上下文的bean

我使用如下XML beans定义创建了这个单独的Spring上下文:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="some.different.package"/>

    <bean id="connectionUrlFactory" class="my.ConnectionUrlFactory">
        <property name="dbServer" value="server.url.com"/>
        <property name="dbDatabasename" value="database"/>
        <property name="dbClientName" value="client"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.sybase.jdbc4.jdbc.SybDriver"/>
        <property name="url" ref="connectionUrlFactory"/>
        <property name="username" value="user"/>
        <property name="password" value="password"/>
    </bean>

</beans>
@Configuration
class Configuration {

    private final ApplicationContext applicationContext;

    Configuration() {
        applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    }

    @Bean
    DaoSybaseImpl sybaseDao() {
        return applicationContext.getBean(DaoSybaseImpl.class);
    }

    @Bean
    DataSource sybaseDataSource() {
        return applicationContext.getBean(DataSource.class);
    }

}
但是,当我运行应用程序时,会出现以下错误:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sybaseDao': Unsatisfied dependency expressed through method 'setDataSource' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: postgresDataSource,sybaseDataSource
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:768)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:720)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
    ... 125 more
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: postgresDataSource,sybaseDataSource
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:220)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1358)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:760)
    ... 140 more
当我从
@配置
中删除
sybaseDataSource
时,错误消失(然后我的应用程序不会启动,因为它缺少
sybaseDataSource


似乎遗留的
ClassPathXmlApplicationContext
确实知道我的“外部”Spring启动上下文。这是怎么回事?

我现在已经删除了“外部”Spring应用程序。使用纯Java代码,我可以不受干扰地加载其他上下文。

这是错误的。放弃
配置
类,在
@springbootplication
注释类上添加
@IMportResource
。这将使xml配置成为正常配置的一部分。之后,您可以将bean从xml移动到java或使用自动配置(如数据源)。@M.Deinum我知道这并不理想。但由于遗留上下文的构造方式,我无法将任何内容移动到一起。我需要两种不同的遗留上下文配置。这根本不起作用,因为您应该使用
@ImportResource