org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка создания бина с именем 'userController' - PullRequest
0 голосов
/ 11 сентября 2018

Связанные вопросы, похоже, не помогают мне. Я впервые разрабатываю веб-приложение с использованием весенней загрузки, и я столкнулся с этой ошибкой. Это мой код.

UserController

package com.rtc_insurance.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.rtc_insurance.dao.UserDAO;
import com.rtc_insurance.entity.Users;

@Controller
@RequestMapping("/user")
public class UserController {

    //inject DAO
    //scan for a component that implements UserDAO interface
    @Autowired
    private UserDAO userDAO;


    @RequestMapping("/list")
    public String listUsers(Model theModel) {

        //get user from the dao
        List<Users> theUsers = userDAO.getUsers();

        //add the customer to the model
        //users = table name
        theModel.addAttribute("users",theUsers);

        return "list-users";
    }
}

UserDAO

package com.rtc_insurance.dao;

import java.util.List;
import com.rtc_insurance.entity.Users;

public interface UserDAO {

    public List<Users> getUsers();
}

UserDAOImpl

package com.rtc_insurance.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;


import com.rtc_insurance.entity.Users;

@Repository
public class UserDAOImpl implements UserDAO {

    //need to inject the session factory
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    @Transactional
    public List<Users> getUsers() {

        //get current hibernate session
        Session currentSession = sessionFactory.getCurrentSession();

        //query
        Query<Users> theQuery = 
                currentSession.createQuery("from users", Users.class);

        //execute result
        List<Users> users = theQuery.getResultList();

        //return list of users
        return users;

    }

}

Servlet

<?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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- Add support for component scanning -->
    <context:component-scan base-package="com.rtc_insurance" />

    <!-- Add support for conversion, formatting and validation support -->
    <mvc:annotation-driven/>

    <!-- Define Spring MVC view resolver -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- Step 1: Define Database DataSource / connection pool -->
    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/rtc_insurance?useSSL=false&amp;characterEncoding=latin1&amp;serverTimezone=UTC" />
        <property name="user" value="root" />
        <property name="password" value="root" /> 

        <!-- these are connection pool properties for C3P0 -->
        <property name="initialPoolSize" value="5"/>
        <property name="minPoolSize" value="5" />
        <property name="maxPoolSize" value="20" />
        <property name="maxIdleTime" value="30000" />
    </bean>  

    <!-- Step 2: Setup Hibernate session factory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan" value="com.rtc_insurance.entity" />
        <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
        </property>
</bean>   

    <!-- Step 3: Setup Hibernate transaction manager -->
    <bean id="myTransactionManager"
            class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- Step 4: Enable configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="myTransactionManager" />

    <!-- Add support for reading web resources: css, images, js, etc ... -->
    <mvc:resources location="/resources/" mapping="/resources/**"></mvc:resources>



</beans>

И я получаю эту ошибку.

1 Ответ

0 голосов
/ 11 сентября 2018

Spring boot делает для вас многое из коробки.

Настройка DataSource

Прежде всего, это источник данных. К сожалению, C3P0 не поддерживается провайдерами пула соединений (только DBCP, Hikari и Tomcat). Это означает, что вам нужно вручную создать компонент DataSource, например:

@Bean
@ConfigurationProperties("custom.datasource")
public ComboPooledDataSource dataSource() {
    return new ComboPooledDataSource();
}

Если вы добавите этот метод в свой основной класс или в любой другой класс, помеченный @Configuration, Spring автоматически выберет компонент источника данных и создаст для вас TransactionManager и SessionFactory. Это также позволяет управлять транзакциями на основе аннотаций.

Поскольку мы используем @ConfigurationProperties, все свойства, начинающиеся с custom.datasource.*, автоматически добавляются в источник данных. Это позволяет вам конфигурировать ваш источник данных из application.properties. Если у вас еще нет такого файла, создайте его в classpath и добавьте следующие свойства:

custom.datasource.jdbc-url=jdbc:mysql://localhost:3306/rtc_insurance?useSSL=false&amp;characterEncoding=latin1&amp;serverTimezone=UTC
custom.datasource.user=root
custom.datasource.password=root
custom.datasource.initial-pool-size=5
custom.datasource.min-pool-size=5
custom.datasource.max-pool-size=20
custom.datasource.max-idle-time=30000

Заменить DAO на пружинные данные

Следующая часть - DAO. Проект Spring Data пытается сделать все это намного проще. Прежде всего, вам нужно добавить зависимость spring-boot-starter-data-jpa в ваш проект. Если вы используете Maven, вы можете сделать следующее:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Исключение является необязательным, но позволяет исключить пул соединений по умолчанию (который является Hikari), поскольку вы его не используете. После этого вы можете заменить все ваши UserDAO и UserDAOImpl на следующие:

public interface UserRepository extends JpaRepository<User, Long> {
}

Создавая интерфейс и расширяясь от JpaRepository (или CrudRepository, ...), Spring знает, что он должен создать для вас компонент репозитория с типом User и идентификатором типа * 1035. * (вы не поделились своей User сущностью, поэтому, если это не Long, вы можете изменить общие параметры).

Он также будет включать некоторые методы по умолчанию, такие как findAll(), findById(), save(), delete(), ..., которые вам больше не нужно писать. Так как вы getUsers() метод в основном такой же, как операция findAll(). Это означает, что вам не нужен этот код, и вы можете просто подключить UserRepository к своему контроллеру и использовать операцию findAll().

Сканирование компонентов

В вашей конфигурации XML у вас также есть сканирование компонента:

<context:component-scan base-package="com.rtc_insurance" />

В этом больше нет необходимости, поскольку Spring boot автоматически сканирует компоненты в том же пакете или любой подпакет основного класса. Если вы хотите добавить дополнительное компонентное сканирование, вы можете сделать это, добавив аннотацию @ComponentScan("com.xyz") поверх основного класса или любой другой класс, помеченный @Configuration.

Spring MVC, конфигурация

У вас также есть некоторая конфигурация, связанная с Spring MVC, например:

  1. MVC-аннотация, управляемая
  2. Префикс и суффикс распознавателя вида
  3. Расположение статических ресурсов

Поскольку Spring boot автоматически включал аннотации MVC, вы уже можете поцарапать это. С другой стороны, префикс и суффикс распознавателя представлений можно настроить через application.properties, настроив следующие свойства:

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

И наконец, есть статические ресурсы. По умолчанию загрузка Spring автоматически включает ресурсы из нескольких мест, таких как classpath:/static/ и classpath:/public/, в качестве статических расположений ресурсов.

Это означает, что если вы поместите какой-либо файл в эти папки, он будет автоматически обработан.

После этого весь ваш XML-файл конфигурации bean-компонента устарел и может быть удален.

...