Не удалось `Autowired`, не найден компонент типа` SessionFactory` - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь запустить тест для добавления данных в базу данных с помощью Spring Hibernate. Я назначил @Bean для функции getSessionFactory в HibernateConfig.java, но когда я снова вызываю файл DAOImp, я получаю сообщение об ошибке Could not autowire. No beans of 'SessionFactory' type found.

HibernateConfig. java

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {"com.huyvt.onlineshopping.dto"})
public class HibernateConfig {
    private final static String DATABASE_URL = "jdbc:mysql://localhost:3308/onlineshopping?serverTimezone=UTC";
    private final static String DATABASE_DRIVER = "com.mysql.jdbc.Driver";
    private final static String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect";
    private final static String DATABASE_USER = "root";
    private final static String DATABASE_PASSWORD = "";

    @Bean
    public DataSource getDataSource(){
        BasicDataSource dataSource = new BasicDataSource();

        dataSource.setDriverClassName(DATABASE_DRIVER);
        dataSource.setUrl(DATABASE_URL);
        dataSource.setUsername(DATABASE_USER);
        dataSource.setPassword(DATABASE_PASSWORD);
        return dataSource;
    }

    @Bean
    public SessionFactory getSessionFactory(DataSource dataSource){
        LocalSessionFactoryBuilder sessionFactoryBuilder = new LocalSessionFactoryBuilder(dataSource);

        sessionFactoryBuilder.addProperties(getHibernateProperties());
        return sessionFactoryBuilder.buildSessionFactory();
    }

    private Properties getHibernateProperties(){
        Properties properties = new Properties();

        properties.put("hibernate.dialect", DATABASE_DIALECT);
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.format_sql", "true");

        return properties;
    }

    @Bean
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory){
        return new HibernateTransactionManager(sessionFactory);
    }
}

CategoryDAOImp. java

@Repository("categoryDAO")
public class CategoryDAOImp implements CategoryDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    @Transactional
    public boolean add(Category category) {
        try {
            //add category to db
            System.out.println(category.toString());
            sessionFactory.getCurrentSession().persist(category);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

Как исправить?

1 Ответ

0 голосов
/ 21 июня 2020

В каком пакете находится ваш HibernateConfig class?

Этот

@Bean
public SessionFactory getSessionFactory(DataSource dataSource){

не выполняется.

Для подтверждения вы можете выполнить команду 'System. out.println ("XXX") 'вот так:

@Bean
public SessionFactory getSessionFactory(DataSource dataSource){
    System.out.println("sessionFactory bean is getting created")
    ...
}

и проверьте, видите ли вы его в консоли при запуске приложения.

Чтобы убедиться, что он выбран вверх, самый простой способ - убедиться, что у вас есть @ComponentScan в вашем root классе, найденном здесь com.huyvt.onlineshopping.

@ComponentScan без аргументов указывает Spring сканировать текущий пакет и все его подпакетов.

Если вы используете Spring Boot, он автоматически добавляется для вас, когда вы используете @SpringBootApplication.

Кроме того, в вашем методе main , вы можете проверить свои созданные beans так:

private static ApplicationContext applicationContext;

public static void main(String[] args) {
    applicationContext = 
      new AnnotationConfigApplicationContext(SpringComponentScanApp.class);

    for (String beanName : applicationContext.getBeanDefinitionNames()) {
        System.out.println(beanName);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...