Java “线程中的异常”;“主要”;org.springframework.beans.factory.nosuchbeansdefinitionexception:没有名为
我正在为Sprinc IOC容器使用以下配置。 我的app-config.xml是:Java “线程中的异常”;“主要”;org.springframework.beans.factory.nosuchbeansdefinitionexception:没有名为,java,spring,spring-mvc,inversion-of-control,Java,Spring,Spring Mvc,Inversion Of Control,我正在为Sprinc IOC容器使用以下配置。 我的app-config.xml是: <?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:mvc="http://www.springframew
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="myDatasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/bus_db" />
<property name="username" value="sysadmin" />
<property name="password" value="adminadmin" />
</bean>
<!-- <context:property-placeholder location="src/main/java/com/bus/assets/dbinfo.properties" /> -->
</beans>
我的项目结构是:
我将用于注入的Bean类是:
package com.bus.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import com.bus.model.Bus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
@Component("busDAO")
public class BusDAO {
private JdbcTemplate myJdbcTemplate;
public List<Bus> getBusList(){
return myJdbcTemplate.query("select * from bus.bus",
new RowMapper<Bus>() {
@Override
public Bus mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
Bus bus = new Bus();
bus.setBrandName(rs.getString("brand_name"));
bus.setBusId(rs.getInt("bus_id"));
bus.setBusNumber(rs.getString("bus_number"));
bus.setModelNumber("model_number");
//bus.setProdDate(prodDate);
return bus;
}
});
}
public JdbcTemplate getMyJdbcTemplate() {
return myJdbcTemplate;
}
@Autowired
public void setMyJdbcTemplate(DataSource ds) {
this.myJdbcTemplate = new JdbcTemplate(ds);
}
}
包com.bus.dao;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.util.List;
导入javax.sql.DataSource;
导入com.bus.model.bus;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.jdbc.core.RowMapper;
导入org.springframework.stereotype.Component;
@组件(“busDAO”)
公共类BusDAO{
私有JdbcTemplate myJdbcTemplate;
公共列表getBusList(){
返回myJdbcTemplate.query(“select*from bus.bus”,
新的行映射器(){
@凌驾
公共总线映射行(ResultSet rs,int rowNum)引发SQLException{
//TODO自动生成的方法存根
总线=新总线();
bus.setBrandName(rs.getString(“品牌名称”);
bus.setBusId(rs.getInt(“bus_id”);
bus.setBusNumber(rs.getString(“总线号”);
总线设置型号(“型号”);
//总线设置prodDate(prodDate);
回程巴士;
}
});
}
公共JdbcTemplate getMyJdbcTemplate(){
返回myjdbc模板;
}
@自动连线
公共void setMyJdbcTemplate(数据源ds){
this.myJdbcTemplate=新的JdbcTemplate(ds);
}
}
然而,当我尝试测试SpringBean注入时,我得到了一个错误,即无法找到名为“busDAO”的bean。我还向我的Spring工具套件控制台输出了一组空的现有bean
public class TestConnection {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext appcon = new FileSystemXmlApplicationContext("/src/main/webapp/WEB-INF/config/app-config.xml");
System.out.println("Bean names: " + Arrays.toString(appcon.getBeanNamesForType(BusDAO.class)));
BusDAO myBusDAO = appcon.getBean("busDAO", BusDAO.class);
List<Bus> myBusList = myBusDAO.getBusList();
for(Bus b: myBusList) {
System.out.println(b.toString());
}
}
公共类TestConnection{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
ApplicationContext appcon=新文件系统XMLApplicationContext(“/src/main/webapp/WEB-INF/config/app config.xml”);
System.out.println(“Bean名称:+Arrays.toString(appcon.getBeanNamesForType(BusDAO.class));
BusDAO myBusDAO=appcon.getBean(“BusDAO”,BusDAO.class);
List myBusList=myBusDAO.getBusList();
用于(总线b:myBusList){
System.out.println(b.toString());
}
}
}
为了让我的Springbean上下文能够找到丢失的Bean,我可以做得更好吗?- 这里的问题是@Component和@Bean之间似乎存在混淆
- 您需要做的是创建另一个类,用@Configuration注释它
- 在这个类中,您应该创建一个用@Bean注释的函数,这个函数应该返回您启动的Dao
- 如果需要,我可能会为它添加代码 @配置 公共类配置{ @豆子 公共巴士道{ 返回新的BusDAO(); } }
- 这里的问题是@Component和@Bean之间似乎存在混淆
- 您需要做的是创建另一个类,用@Configuration注释它
- 在这个类中,您应该创建一个用@Bean注释的函数,这个函数应该返回您启动的Dao
- 如果需要,我可能会为它添加代码 @配置 公共类配置{ @豆子 公共巴士道{ 返回新的BusDAO(); } }
很抱歉代码格式不正确:)您需要将
上下文:组件扫描
元素添加到app config.xml
或手动实例化bean:
<bean id="busDAO" class="com.bus.dao.BusDAO">
<!-- specifics omitted as i am not that good with xml config -->
</bean>
您需要将
context:component scan
元素添加到app config.xml
或手动实例化bean:
<bean id="busDAO" class="com.bus.dao.BusDAO">
<!-- specifics omitted as i am not that good with xml config -->
</bean>
我所做的:向busDAO添加了一个名为private DataSource DataSource的属性
@Component("busDAO")
public class BusDAO {
private JdbcTemplate myJdbcTemplate;
private DataSource dataSource;
.....
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.myJdbcTemplate = new JdbcTemplate(dataSource);
}
然后按照xml配置配置bean:
我所做的:向busDAO添加了一个名为private-DataSource-DataSource的属性
@Component("busDAO")
public class BusDAO {
private JdbcTemplate myJdbcTemplate;
private DataSource dataSource;
.....
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.myJdbcTemplate = new JdbcTemplate(dataSource);
}
然后按照xml配置配置bean:
很可能不会发现该类,由于没有进行组件扫描,我们必须查看他的整个代码库,看看他是否在任何地方声明了componentscan注释,以确认我猜…很可能不会发现该类,由于没有进行组件扫描,我们必须查看他的整个代码库,看看他是否在任何地方声明了componentscan注释,以确认我猜…我试图在app-config.xml中添加一个新bean,但是,即使我在setter方法中声明了autowire,该bean也被初始化为null,以便注入到datasource.哪个bean被初始化为null?datasource、jdbcTemplate还是busDAO?jdbcTemplate被初始化为null,因此busDAOdataSource不是null由于缺少很多信息,我只能在这里假设,但是尝试以下操作很可能很有用:*不要自己创建新的jdbcTemplate,直接注射。工作的JdbcTemplate需要显式调用afterPropertiesSet
*尝试通过构造函数注入busDao
如果有数据源
要注入,则该总线将不会为空
-但是,由于缺少组件,可能无法发现setter上的@Autowired
扫描
。请记住,您可以在xml中声明一个bean ref
,以将现有bean引用传递给我尝试在app conf中添加新bean的方法