java PSQLException:服务器请求基于密码的身份验证,但未提供密码

bakd9h0s  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(487)

我有一个Sping Boot 项目,我试图连接到一个本地PostgreSQL数据库。数据源是从DataSourceBuilder示例化的。在本例中,我将数据库用户名、密码和数据库URL硬编码(它们将通过属性文件传递),实现如下所示:

String url = "jdbc:postgresql://localhost:5433/<TABLENAME>";

String username = <USERNAME>;
String password = <PASSWORD>;

return DataSourceBuilder
            .create()
            .driverClassName("org.postgresql.Driver")
            .url(url)
            .username(username)
            .password(password)
            .build();

当我运行Spring Application main方法时,抛出了以下异常:

Caused by: org.postgresql.util.PSQLException: 
The server requested password-based authentication, but no password was provided.
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:534)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:141)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192)

我试着用sudo passwd postgres修改了几次 postgres 用户密码,但是好像不起作用。

r7xajy2e

r7xajy2e1#

我的猜测是,您没有将bean注入到Spring容器中,因此可以使用如下代码:

@Bean
public DataSource dataSource() {
    String url = "jdbc:postgresql://localhost:5433/<DATABASE_NAME>";

    String username = <USERNAME>;
    String password = <PASSWORD>;

    return DataSourceBuilder
            .create()
            .driverClassName("org.postgresql.Driver")
            .url(url)
            .username(username)
            .password(password)
            .build();
}

顺便说一句,在jdbcUrl中,您需要使用DatabaseName,而不是TableName。

注意:我认为最好利用Sping Boot 已经自动配置了所有内容的方式,所以我建议您这样做:

@Configuration
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public class DatabaseConfig extends HikariConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(this);
    }
}

并使用以下属性:

spring.datasource.hikari.jdbcUrl=jdbc:postgresql://localhost:5433/blog
spring.datasource.hikari.username=user
spring.datasource.hikari.password=user
spring.datasource.hikari.driverClassName=org.postgresql.Driver

你可以在这里查看我的一个工作示例:https://github.com/vladucuvoican/simple-blog/blob/master/src/main/resources/application.properties

t9aqgxwy

t9aqgxwy2#

问题可能是由bean扫描引起的
我有同样的问题,但日志没有指出这一点。
试试看:

@Configuration
public class DataSourceConfig {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClass;
    @Value("${spring.datasource.data-username}")
    private String url;
    @Value("${spring.datasource.data-username}")
    private String userName;
    @Value("${spring.datasource.data-password}")
    private String password;

    @Bean
    public DataSource getDataSource() {
        return DataSourceBuilder.create()
                .driverClassName(driverClass)
                .url(url)
                .username(userName)
                .password(password)
                .build();
    }
}

如果使用SpringBoot,请使用SpringBootApplication runner移动到包中,或者手动定义扫描

相关问题