Spring использует имя компьютера вместо предоставленного имени пользователя для доступа к базе данных jdb c - PullRequest
2 голосов
/ 14 февраля 2020

Чтение Pro Spring 5, пример, который показывает, что Spring JDB C использует MySQL DB. Я использую исходный код книги. Вот код

@Configuration
@PropertySource("classpath:db/jdbc2.properties")
@ComponentScan(basePackages = "com.apress.prospring5.ch6")
public class AppConfig {

    private static Logger logger = LoggerFactory.getLogger(AppConfig.class);
    @Value("${driverClassName}")
    private String driverClassName;
    @Value("${url}")
    private String url;
    @Value("${username}")
    private String username;
    @Value("${password}")
    private String password;

@Bean(destroyMethod = "close")
    public DataSource dataSource() {
        try {
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName(driverClassName);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        } catch (Exception e) {
            logger.error("DBCP DataSource bean cannot be created!", e);
            return null;
        }
    }

jdbc2.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/musicdb?useSSL=true
username=prospring5
password=prospring5

В тесте

public class AnnotationJdbcTest {

    private GenericApplicationContext ctx;
    private SingerDao singerDao;

    @Before
    public void setUp() {
        ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        singerDao = ctx.getBean(SingerDao.class);
        assertNotNull(singerDao);
    }

    @Test
    public void testFindAll() {
        List<Singer> singers = singerDao.findAll();
        assertTrue(singers.size() == 3);
        listSingers(singers);
        ctx.close();
    }

Мой MySQL экземпляр уже есть пользователь prospring5 и созданная схема и заполняется

enter image description here enter image description here

Когда я пытаюсь запустить AnnotationJdbcTest, я получаю это исключение:

Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Access denied for user 'Mehdi'@'localhost' (using password: YES))
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Access denied for user 'Mehdi'@'localhost' (using password: YES))
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:612)

Как вы видите, проект использует имя моего компьютера 'Mehdi' вместо того, которое указано в файле .properties 'prospring5'. Это почему? и как я могу это исправить?

Вы можете сами скачать исходный код и запустить его отсюда: https://github.com/Apress/pro-spring-5 Проект: chapter6 / spring-jdb c -аннотации

РЕДАКТИРОВАТЬ: Я напечатал значения, как предложено @STaefi, и вот вывод:

com.mysql.cj.jdbc.Driver
jdbc:mysql://localhost:3306/musicdb?useSSL=false
Mehdi
prospring5

Код

@Bean()
    public DataSource dataSource() {
        try {
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName(driverClassName);
            System.out.println(driverClassName);
            dataSource.setUrl(url);
            System.out.println(url);
            dataSource.setUsername(username);
            System.out.println(username);
            dataSource.setPassword(password);
            System.out.println(password);
            return dataSource;

Сначала я попробовал установка значений при инициализации, и это не было хорошо. но после того, как я использовал username = "prospring5"; dataSource.setUsername(username);, это сработало. так что это значит. почему Spring не может загрузить имя пользователя, как будто оно успешно загрузило URL и пароль.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Итак, я исправил проблему, просто используя другой идентификатор строки в файле .propreties. Я изменил его на one=prospring5, и это сработало. Очевидно, что при использовании свойства с именем «username» будет загружено что угодно, кроме имени вашего компьютера. Я не знаю, предоставляет ли Spring список запрещенных значений для имен свойств. если они этого не делают, они, безусловно, должны рассмотреть.

0 голосов
/ 14 февраля 2020

Не могли бы вы попробовать, указав значение по умолчанию:

@Value("${driverClassName:com.mysql.cj.jdbc.Driver}")
private String driverClassName;
@Value("${url:jdbc:mysql://localhost:3306/musicdb?useSSL=true}")
private String url;
@Value("${username:prospring5}")
private String username;
@Value("${password:prospring5}")
private String password;

И удалите @PropertySource ("classpath: db / jdbc2.properties") вверху. Если это работает, вы можете попробовать использовать propertySource снова

...