web-dev-qa-db-ja.com

フィールドjdbcTemplateには、タイプ「org.springframework.jdbc.core.JdbcTemplate」のBeanが必要でしたが、見つかりませんでした

MySQLデータベースに接続するためにこの単純なアプリケーションを作成したところ、次のエラーが発生しました。

org.springframework.jdbc.core.JdbcTemplate

私の構成では(com.kubamadry.dao.MySqlStudentDao)

*****************************
APPLICATION FAILED TO START
*****************************

Description:

Field jdbcTemplate in com.kubamadry.dao.MySqlStudentDao required a bean of type 'org.springframework.jdbc.core.JdbcTemplate' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.jdbc.core.JdbcTemplate' in your configuration.

Disconnected from the target VM, address: '127.0.0.1:49838', transport: 'socket'

Process finished with exit code 1

プロジェクトの構造:

画像

クラス

メイン

package com.kubamadry;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {
    public static void main(String args[]) {
        SpringApplication.run(Main.class, args);
    }
}

学生

package com.kubamadry.entity;

public class Student {
    private int id;
    private String name;
    private String course;
}
//Constructor, getters and setters

StudentController

package com.kubamadry.controller;

import com.kubamadry.entity.Student;
import com.kubamadry.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import Java.util.Collection;

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @RequestMapping(method = RequestMethod.GET)
    public Collection<Student> getAllStudents() {
        return studentService.getAllStudents();
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public Student getStudentById(@PathVariable int id) {
        return studentService.getStudentById(id);
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public void deleteStudentById(@PathVariable int id) {
        studentService.deleteStudentById(id);
    }

    @RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void updateStudent(@RequestBody Student student) {
        studentService.updateStudent(student);
    }

    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void addStudent(@RequestBody Student student) {
        studentService.addStudent(student);
    }
}

MySqlStudentDao

package com.kubamadry.dao;

import com.kubamadry.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.jdbc.core.JdbcTemplate;

import Java.sql.ResultSet;
import Java.sql.SQLException;
import Java.util.Collection;
import Java.util.List;

@Repository("mysql")
public class MySqlStudentDao implements StudentDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public Collection<Student> getAllStudents() {
        final String sql = "SELECT * FROM students";
        List<Student> students = jdbcTemplate.query(sql, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student = new Student();
                student.setId(resultSet.getInt("id"));
                student.setName(resultSet.getString("name"));
                student.setCourse(resultSet.getString("course"));
                return student;
            }
        });
        return students;
    }

    @Override
    public Student getStudentById(int id) {
        return null;
    }

    @Override
    public void deleteStudentById(int id) {
         //
    }

    @Override
    public void updateStudent(Student student) {
         //
    }

    @Override
    public void addStudent(Student student) {
         //
    }
}

application.properties

spring.datasource.url=jdbc:mysql://localhost/students
spring.datasource.username=root
spring.datasource.password=password123

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kubamadry</groupId>
    <artifactId>workingProject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-Java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-Java</artifactId>
            <version>6.0.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>

    </dependencies>

    <properties>
        <Java.version>1.8</Java.version>
    </properties>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

この問題で私を助けてください。

6
Kuba Madry

JdbcTemplate Beanは、任意の@Configurationクラスで宣言する必要があります。次に例を示します。

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

また、spring-boot-starter-jdbc依存関係の代わりにspring-jdbcの使用を検討してください。スターターモジュールには、将来必要になるライブラリのほとんどが含まれています。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
0

私も同じ問題を抱えていました。たぶん、それはあなたの仕事ではありません。コードを1日検索したところ、pom.xmlファイルの依存関係に問題があることがわかりました。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <scope>test</scope>
</dependency>

しかし、2つの依存関係の「テスト」を削除すると、プロジェクトが機能していることがわかりました。 pom.xmlで依存関係を確認すると(mavenを使用している場合)、問題を解決できると思います:)

0
payamkhalili

pom.xml(Tomcat JDBC接続プール)

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

    <dependency>
        <groupId>org.Apache.Tomcat</groupId>
        <artifactId>Tomcat-jdbc</artifactId>
    </dependency>

pom.xml(HikariCP)

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>

    </dependency>

YAML

spring:
  application:
    name: app

  datasource:
    url: url
    username: user
    password: password
    driver-class-name: driverClass

それだ。これで、アプリケーションでJdbcTemplateの使用を開始できます

@Autowired
private JdbcTemplate jdbcTemplate;
0
Ashish Bhosle