Требуется одиночный бин, но 2 были найдены даже при ссылке в конфигурации Spring - PullRequest
0 голосов
/ 22 июня 2019

springconfig.xml

<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
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config/>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />  
        <property name="username" value="hr" />  
        <property name="password" value="hr" />  
    </bean>

    <bean id="prodDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />  
        <property name="username" value="hr" />  
        <property name="password" value="hr" />  
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>

    <bean id="prodJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="prodDataSource"></property>  
    </bean>  

</beans>  

Также мой основной класс выглядит так:

@ImportResource("springconfig.xml")
@SpringBootApplication
public class TestingFrameworkrunner {

    public static void main(String[] args) {
        ConfigurableApplicationContext context=SpringApplication.run(TestingFrameworkrunner.class, args);
        EmployeeDao employeeDao=context.getBean("employeeDao",EmployeeDao.class);
        employeeDao.deleteEmployee(1);
        employeeDao.getAllEmployees().forEach(e->e.display());
        context.close();
    }

}

Это ошибка, которую я получаю -

Field jdbcTemplate in com.NettingTestingFramework.EmployeeDao required a single bean, but 2 were found:
    - dataSource: defined in class path resource [springconfig.xml]
    - prodDataSource: defined in class path resource [springconfig.xml]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

В моем даоУ меня есть файл:

@Component
public class EmployeeDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    JdbcTemplate prodJdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void setProdJdbcTemplate(JdbcTemplate prodJdbcTemplate) {
        this.prodJdbcTemplate = prodJdbcTemplate;
    }

    public void addEmployee(Employee e) {
        String sql="INSERT INTO EMPLOYEE VALUES(?,?,?,?)";
        jdbcTemplate.update(sql,new Object[] {e.getId(),e.getName(),e.getDescription(),e.getSalary()});
    }
}

Почему это дает эту ошибку?Я предоставил источник данных для обоих jdbcTemplates.Также на данный момент мы можем просто игнорировать значения свойств источника данных, так как они будут различаться для двух источников данных.

Поэтому я использовал ref в springconfig.xml, как показано ниже, и я автоматически подключил оба jdbcTemplates.

«prodjdbcTemplate» предназначен для подключения к базе данных prod.

«jdbcTemplate» предназначен для подключения к базе данных производительности.

Update

Когда я изменилсямой основной класс:

package com.NettingTestingFramework;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestingFrameworkrunner {

    public static void main(String[] args) {
        ConfigurableApplicationContext context=new ClassPathXmlApplicationContext("springconfig.xml");
        EmployeeDao employeeDao=context.getBean("employeeDao",EmployeeDao.class);
        employeeDao.deleteEmployee(1);
        employeeDao.getAllEmployees().forEach(e->e.display());
        context.close();
    }

}

, удалил @Component из класса EmployeeDao и просто создал пустой bean-компонент в springconfig, например:

<bean id="employeeDao" class="com.NettingTestingFramework.EmployeeDao">

    </bean>

Все работало нормально.Но большой вопрос, почему предыдущая вещь не работает?Поскольку я хочу, чтобы это было SpringBootApplication, есть какое-то решение, чтобы я мог сделать это, как в моем предыдущем коде.

1 Ответ

0 голосов
/ 22 июня 2019

Ошибка кристально ясна. Вы должны использовать только один источник данных (dataSource и prodDatasource).

Удалите один из них в вашем XML или установите его в качестве основного.

Это должен быть один и тот же bean-компонент, и вы должны просто изменить URL и учетные данные в файле конфигурации каждой среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...