Исключение в потоке "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: Бин не указан - PullRequest
0 голосов
/ 13 мая 2019

Я использую следующую конфигурацию для контейнера 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.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>

Моя структура проекта:

enter image description here

Мой класс Бинов, который будет использоваться для инъекций:

    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);
    }

}

Однако, когда я пытаюсь протестировать инъекцию Spring bean, я получаю сообщение об ошибке, что bean-компонент с именем busDAO не может быть найден. Я также вывел в консоль Spring Tool Suite массив существующих 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());
    }

}

}

Что я мог бы сделать лучше, чтобы мой контекст Spring Bean мог найти отсутствующий компонент?

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Вам необходимо либо добавить элемент context:component-scan в app-config.xml, либо создать экземпляр компонента вручную:

<bean id="busDAO" class="com.bus.dao.BusDAO">
  <!-- specifics omitted as i am not that good with xml config -->
</bean>

Для варианта создания экземпляра вручную в аннотированном классе @Configuration снова потребуетсяcontext:component-scan элемент или определение компонента указанного класса:

<bean id="myConfiguratioClass" class="com.bus.configuration.MyConfigClass" />
1 голос
/ 13 мая 2019
  • Проблема здесь в том, что между @Component и @ Bean существует путаница.
  • Что вам нужно сделать, это создать еще один класс и добавить к нему @ Configuration.
  • В этом классе вы должны создать функцию с аннотацией @Bean, и эта функция должна возвратить ваш инициированный Dao.
  • Я мог бы добавить код для него, если требуется.

    @ конфигурации открытый класс DaoConfiguration { @Bean общественный BusDAO дао { вернуть новый BusDAO (); } }

И вы можете использовать этот боб, используя @Autowired BusDAO busDao

Прошу прощения за плохо отформатированный код:)

0 голосов
/ 13 мая 2019

Что я сделал: добавил в 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 id="busDAO" class="com.bus.dao.BusDAO"> <property name="dataSource" ref="dataSource" /> </bean>

...