Как сделать класс конфигурации из application.properties в spring-boot? - PullRequest
0 голосов
/ 22 апреля 2020

У меня два вопроса.

Во-первых, я тестировал соединение с БД при весенней загрузке, как показано ниже.

@RunWith(SpringJUnit4ClassRunner.class)
public class OracleConnectionTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnectionTest.class);

    private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    private static final String USER = "user1";
    private static final String PW = "user1";

    @Test
    public void testConnection() throws ClassNotFoundException {
        Class.forName(DRIVER);

        try (Connection connection = DriverManager.getConnection(URL, USER, PW)) {
            LOGGER.info(String.valueOf(connection));
        } catch (SQLException e) {
            LOGGER.error(String.valueOf(e));
        }
    }
}

Но я хотел разделить информацию о БД в файле application.properties (resources / application.properties). Поэтому мне нужно создать файл JdbcConfig (java bean), как показано ниже (с тестовым кодом).

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class JdbcConfig {
    @Value("${driver-class-name}")
    private String driverClassName;
    @Value("${url}")
    private String url;
    @Value("${username}")
    private String username;
    @Value("${password}")
    private String password;

    @Override
    public String toString() {
        return "JdbcConfig[" +
                "driverClassName=" + driverClassName
                + ", url=" + url
                + ", username=" + username
                + ", password=" + password
                + "]";
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JdbcConfig.class})
public class OracleConnectionTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnectionTest.class);

    @Autowired
    private JdbcConfig jdbcConfig;

    @Test
    public void testConnection() throws ClassNotFoundException {
        LOGGER.info("Test: {}", jdbcConfig.toString());

        Class.forName(jdbcConfig.getDriverClassName());

        try (Connection connection = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUsername(), jdbcConfig.getPassword())) {
            LOGGER.info(String.valueOf(connection));
        } catch (SQLException e) {
            LOGGER.error(String.valueOf(e));
        }
    }
}

Однако я столкнулся с NullPointerException(JdbcConfig) при запуске testConnection(). Поэтому мне нужно изменить класс JdbcConfig следующим образом.

@Getter
@Setter
@Component
@PropertySource("classpath:application.properties")
public class JdbcConfig {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    @Override
    public String toString() {
        return "JdbcConfig[" +
                "driverClassName=" + driverClassName
                + ", url=" + url
                + ", username=" + username
                + ", password=" + password
                + "]";
    }
}

Я не понимаю, почему аннотации @Configuration & @ConfigurationProperties не применяются.

Во-вторых, я думал, что spring- boot автоматически создаст DataSource(javax.sql.DataSource), прочитав application.properties. Например, мой друг успешно тестирует без создания компонента DataSource (класс). Но я столкнулся с ошибкой, как показано ниже.

Unsatisfied dependency expressed through field 'ds'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available

Так что мне нужно создать компонент DataSource. Я не знаю, почему код моего друга автоматически работает без создания бина (DataSource) в отличие от меня. Мой код ниже.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DataSourceConfig.class)
public class DataSourceTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceTest.class);

    @Autowired
    private DataSource ds;  // DataSource & DriverManagerDataSource

    @Test
    public void testConnection() throws Exception {
        try (Connection con = ds.getConnection()) {
            LOGGER.info(String.valueOf(con));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
@Configuration
@Import(JdbcConfig.class)
public class DataSourceConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceConfig.class);

    @Bean
    public DataSource dataSource(JdbcConfig jdbcConfig) {
        LOGGER.debug("Test: {}", jdbcConfig.toString());
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(jdbcConfig.getDriverClassName());
        dataSource.setUrl(jdbcConfig.getUrl());
        dataSource.setUsername(jdbcConfig.getUsername());
        dataSource.setPassword(jdbcConfig.getPassword());
        return dataSource;
    }
}

Спасибо за чтение моего длинного текста.


добавление файла свойств (application.properties)

# JSP
spring.mvc.view.prefix = /WEB-INF/jsp/
spring.mvc.view.suffix = .jsp

# language setting
spring.http.encoding.charset = UTF-8
spring.http.encoding.enabled = true
spring.http.encoding.force = true

# Database Info
spring.datasource.driver-class-name = oracle.jdbc.driver.OracleDriver
spring.datasource.url = jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.datasource.username = user1
spring.datasource.password = user1

1 Ответ

0 голосов
/ 22 апреля 2020

Все, что вам нужно:

@Getter
@Setter
@ConfigurationProperties(prefix = "spring.datasource")

+
@EnableConfigurationProperties(YourPropertiesClass.class) на любом классе конфигурации

Если вы используете Spring Boot 2. +, то даже это избыточно. См. примечания к выпуску для более


Необходимо добавить @ConfigurationPropertiesScan сейчас

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