Весенний конфиг для подключения к Postgres.Нужен компонент: 'org.flywaydb.core.internal.jdbc.JdbcTemplate' - PullRequest
0 голосов
/ 23 сентября 2019

Я получаю эту ошибку при попытке запустить мое приложение Spring.

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-09-22 23:55:45.397 ERROR 36321 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

Parameter 0 of constructor in com.example.demo.dao.UserDataAccessService required a bean of type 'org.flywaydb.core.internal.jdbc.JdbcTemplate' that could not be found.


Action:

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

Приложение работает, когда я использую мой файл fakeUserData.Кажется, что есть проблема с зависимостями, но я дважды проверил, и похоже, что все зависимости есть.

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

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

        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

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

</project>

application.yml

app:
  datasource:
    jdbc-url: jdbc:postgresql://localhost:5432/springbootpostgresdb
    username: postgres
    password: password
    pool-size: 30

UserDataAccessService.java

package com.example.demo.dao;

import com.example.demo.model.User;
import org.flywaydb.core.internal.jdbc.JdbcTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.sql.SQLException;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

@Repository("postgresql")
public class UserDataAccessService implements Userdao {

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public UserDataAccessService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public int insertUser(UUID id, User user) {
        return 0;
    }

    @Override
    public int deleteUserById(UUID id) {
        return 0;
    }

    @Override
    public int updateUserById(UUID id, User user) {
        return 0;
    }

    @Override
    public Optional<User> selectUserById(UUID id) {
        return Optional.empty();
    }

    @Override
    public List<User> selectAllUsers() {
        final String sql = "SELECT id,name FROM userProfile";

        try {
            return jdbcTemplate.query(sql, (resultSet) -> {
                UUID id = UUID.fromString(resultSet.getString("id"));
                String name = resultSet.getString("name");
                return new User(id, name);
            });
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

PostgresDataSource.java

package com.example.demo.datasource;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PostgresDataSource {

    @Bean
    @ConfigurationProperties("app.datasource")
    public HikariDataSource hikariDataSource() {
        return DataSourceBuilder
                .create()
                .type(HikariDataSource.class)
                .build();
    }
}

1 Ответ

0 голосов
/ 24 сентября 2019

Как говорится в сообщении об ошибке, первый аргумент вашего UserDataAccessService конструктора - org.flywaydb.core.internal.jdbc.JdbcTemplate

Вы не определили bean-компонент этого типа ни в одном из опубликованных вами источников, и автоконфигурация выигралане создайте его для вас, следовательно, ошибка.

Согласно источнику Flyway , этот класс представляет собой:

Коллекция служебных методов для запросаDB.Вдохновленный Spring JdbcTemplate


Теперь, если бы вы попытались внедрить более распространенный org.springframework.jdbc.core.JdbcTemplate, вам не нужно было бы определять какой-либо компонент, так как автоконфигурация - JdbcTemplateAutoConfiguration - создал бы вас a JdbcTemplate на основе вашего HikariDataSource.

Так что вы можете:

  • Объявить бин типа org.flywaydb.core.internal.jdbc.JdbcTemplate, если эточто вы действительно хотите.Вероятно, нет, так как это часть "внутреннего" пакета, и, кроме того, вы действительно не хотите, чтобы ваш сервисный уровень знал о вашем инструменте миграции схемы.
  • Или переключитесь на JdbcTemplate в Spring и продолжайте процессавтоконфигурации - хорошая вещь.

Взяв второй вариант и исправив импорт JdbcTemplate в UserDataAccessService (также комментируя реализацию selectAllUsers - что вам понадобитсянастроить - и добавить пустышку db/migration/V1_0__initial.sql) - все, что мне нужно было сделать, чтобы обойти вашу проблему:

$ mvn clean spring-boot:run

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.8.RELEASE)

2019-09-24 12:00:27.033  INFO 18509 --- [main] com.example.demo.Main                    : Starting Main on ...
2019-09-24 12:00:27.035  INFO 18509 --- [main] com.example.demo.Main                    : No active profile set, falling back to default profiles: default
2019-09-24 12:00:27.692  INFO 18509 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-09-24 12:00:27.711  INFO 18509 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-09-24 12:00:27.712  INFO 18509 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.24]
2019-09-24 12:00:27.769  INFO 18509 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-09-24 12:00:27.769  INFO 18509 --- [main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 711 ms
2019-09-24 12:00:27.863  INFO 18509 --- [main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 5.2.4 by Boxfuse
2019-09-24 12:00:27.868  INFO 18509 --- [main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

С вашими проектными зависимостями все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...