需要单个 bean,但即使在 Spring 配置中引用时也找到了 2 个
Required Single bean but 2 were found even when referenced in Spring config
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>
我的主要 class 也是这样的:
@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
在我的 dao 文件中我有:
@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 提供了数据源。另外现在我们可以忽略数据源属性值,因为它们对于两个数据源来说是不同的。
所以我在 springconfig.xml 中使用了 ref,如下所示,我已经自动连接了两个 jdbcTemplates。
"prodjdbcTemplate"用于连接产品数据库。
"jdbcTemplate" 用于连接性能数据库。
更新
当我将 main class 更改为 :
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();
}
}
并从 EmployeeDao 中删除了 @Component class 并在 springconfig 中创建了一个空 bean,例如:
<bean id="employeeDao" class="com.NettingTestingFramework.EmployeeDao">
</bean>
一切正常。但最大的问题是为什么之前的东西不起作用?
因为我希望这是一个 SpringBootApplication 是否有一些解决方案,以便我可以像在我以前的代码中那样做。
错误非常清楚。您只能在(dataSource 和 prodDatasource)之间使用一个数据源。
在您的 XML 中删除其中一个或将其中一个设为主要。
它应该是同一个 bean,您只需在每个环境的配置文件中更改 url 和凭证。
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>
我的主要 class 也是这样的:
@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
在我的 dao 文件中我有:
@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 提供了数据源。另外现在我们可以忽略数据源属性值,因为它们对于两个数据源来说是不同的。
所以我在 springconfig.xml 中使用了 ref,如下所示,我已经自动连接了两个 jdbcTemplates。
"prodjdbcTemplate"用于连接产品数据库。
"jdbcTemplate" 用于连接性能数据库。
更新
当我将 main class 更改为 :
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();
}
}
并从 EmployeeDao 中删除了 @Component class 并在 springconfig 中创建了一个空 bean,例如:
<bean id="employeeDao" class="com.NettingTestingFramework.EmployeeDao">
</bean>
一切正常。但最大的问题是为什么之前的东西不起作用? 因为我希望这是一个 SpringBootApplication 是否有一些解决方案,以便我可以像在我以前的代码中那样做。
错误非常清楚。您只能在(dataSource 和 prodDatasource)之间使用一个数据源。
在您的 XML 中删除其中一个或将其中一个设为主要。
它应该是同一个 bean,您只需在每个环境的配置文件中更改 url 和凭证。