Для параметра 0 конструктора в .. требуется bean-компонент типа org.springframework.jdb c .core.namedparam.NamedParameterJdbcTemplate не найден - PullRequest
1 голос
/ 18 февраля 2020

Я написал простое приложение todo (на основе того, что входит в apress pro spring boot , в котором мы используем jdb c для работы с базой данных, в репозитории у нас есть следующий код для работы с база данных h2

package com.apress.todo.repository;

import java.sql.ResultSet;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.apress.todo.domain.ToDo;

@Repository
public class ToDoRepository implements CommonRepository<ToDo> {
    private static final String SQL_INSERT ="insert into todo (id,\r\n" + 
            "description, created, modified, completed) values (:id,:description,\r\n" + 
            ":created,:modified,:completed)";
    private static final String SQL_QUERY_FIND_ALL = "select id,"
            +"description, created, modified, completed from todo";
    private static final String SQL_QUERY_FIND_BY_ID = SQL_QUERY_FIND_ALL +
            " where id = :id";
    private static final String SQL_UPDATE = "update todo set description ="
            +":description, modified = :modified, completed = :completed"
            +"where id = :id";
    private static final String SQL_DELETE = "delete from todo where id = :id";
    private final NamedParameterJdbcTemplate jdbcTemplate;





    public ToDoRepository(NamedParameterJdbcTemplate jdbcTemplate) {//HERE IS WHERE THE PROBLEM IS
        System.out.println("hi masoud");
        this.jdbcTemplate = jdbcTemplate;
    }





    private RowMapper<ToDo> toDoRowMapper = (ResultSet rs, int rowNum) -> {
        ToDo toDo = new ToDo();
        toDo.setId(rs.getString("id"));
        toDo.setDescription(rs.getString("description"));
        toDo.setModified(rs.getTimestamp("modified").toLocalDateTime());
        toDo.setCreated(rs.getTimestamp("created").toLocalDateTime());
        toDo.setCompleted(rs.getBoolean("completed"));
        return toDo;
    };

и ниже - мой основной бегун приложения весенней загрузки

package com.apress.todo;

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


@SpringBootApplication
public class TodoInMemoryApplication {

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

}

, но когда я запускаю приложение с использованием интерфейса командной строки пружинной загрузки, я получаю следующую ошибку: Описание :

Parameter 0 of constructor in com.apress.todo.repository.ToDoRepository required a bean of type 'org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate' that could not be found.


Action:

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

в книге больше ничего не объясняется.

1 Ответ

1 голос
/ 19 февраля 2020

Я не знаю, как выглядят примеры в вашей книге, но я постараюсь вам помочь. Смотри, ты объявляешь поле private final NamedParameterJdbcTemplate jdbcTemplate;. Каким-то образом вы надеетесь на весну, чтобы инициализировать это Для этого вы должны объявить @Bean с типом NamedParameterJdbcTemplate в классе @Configuration или создать класс @Component, расширяющий NamedParameterJdbcTemplate. Или продлите NamedParameterJdbcDaoSupport и получите через getNamedParameterJdbcTemplate();

Собственно с вашим примером, добавив spring-boot-starter-jdbc

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

и добавив свойства, например

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

, следует решить эта проблема согласно учебник

...