У меня два вопроса.
Во-первых, я тестировал соединение с БД при весенней загрузке, как показано ниже.
@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