|
我有两个问题。首先,我在spring-boot中测试了db连接,如下图所示。
& K5 x/ m6 w9 i4 X W* l/ x- @RunWith(SpringJUnit4ClassRunner.class)
: u; b, n6 A; h6 c3 x7 A - public class OracleConnectionTest {
7 ?: }/ U5 G& _6 d, [# ~: u L% \" D - private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnectionTest.class);5 }8 d) }7 @+ c& _; p% y
" T, e% V; _/ v$ Q& B6 B- private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";" m) }0 X8 Y# U: T# I
- private static final String URL = "jdbcracle:thin127.0.0.1:1521rcl";+ x6 a/ S3 |: w
- private static final String USER = "user1";) A6 V _) n, `0 j0 H+ D/ L
- private static final String PW = "user1";
) W& b$ v6 w5 d) k8 p1 X% E; f: K
0 I0 [# G( T' |; I& E+ j# ?* S: h% z- @Test
- b: |1 X/ a6 z1 ^& L - public void testConnection() throws ClassNotFoundException {3 X! G% A% U! Q3 Y
- Class.forName(DRIVER);
) w' G- ?& k8 j3 A
# i! g8 ?6 M. b: h V6 B- try (Connection connection = DriverManager.getConnection(URL, USER, PW)) {$ D# \" ]2 [0 v' J% |. E* r- x
- LOGGER.info(String.valueOf(connection));
/ x7 O& y- y" g: K - } catch (SQLException e) {& z) N6 H3 c! ]5 f
- LOGGER.error(String.valueOf(e));
* w0 N! [6 i, C& ^. Y: x6 b - }
* S K0 T3 G* p - }}6 j- M% I9 @' X$ X; T
但是我想把DB信息分离到application.properties文件(resourcesapplication.properties)中去,所以我需要制作JdbcConfig文件(java Bean)。所以我需要制作JdbcConfig文件(java bean),如下图所示(含测试代码)。( m. m8 E( T# r7 z; k
- @Getter/ k* i7 _ I( a) _ Q% `
- @Setter# A6 j$ `) g/ r2 V! K2 I% h
- @Configuration- v8 Z9 p0 ?* H: D# ~9 w. }0 t0 O, {
- @ConfigurationProperties(prefix = "spring.datasource")+ o% P4 q3 ]/ I. q- o9 L
- public class JdbcConfig {9 z6 f$ e3 k8 X+ y2 A, w
- @Value("${driver-class-name}")
6 q1 |- l/ O O& V- W! [ - private String driverClassName;
: m6 a ^& p3 v9 W; n8 B4 | - @Value("${url}")- v6 x/ y! m9 h7 Z
- private String url;
4 T+ y1 ]- P1 L - @Value("${username}") p9 M- d# l9 l9 x. R' \1 N; e! R
- private String username;
1 n: R0 z/ g& n8 \8 h$ L" u - @Value("${password}"): e4 W; T4 [8 h5 _* d$ g
- private String password;
6 w- A5 D4 f) S4 t# y) J
; ^& G v0 Q5 m; Q6 k0 g1 g( f- @Override
$ Q, I) }% N5 v* I - public String toString() {6 n7 M O, z& O% S! c
- return "JdbcConfig[" +
# a( {0 ^0 C8 n# b5 M3 Z - "driverClassName=" + driverClassName3 R; V P5 N% d h6 [" z# k9 N) n
- + ", url=" + url* C9 V$ b$ Y1 W8 e8 ]: m; [& |% u5 {
- + ", username=" + username
- w# M: O, ^' U" ?. W - + ", password=" + password
; P: A0 h% M6 P( Y. n7 r - + "]";
) M; s& r! M d+ @7 X) o) ] - }}* G( B5 `0 p0 s. b/ I
$ @% V! _, R) ?$ c% o& d
- @RunWith(SpringJUnit4ClassRunner.class)/ H U+ \/ d- p9 x6 [+ P5 o. W
- @ContextConfiguration(classes = {JdbcConfig.class})( Q0 j. O5 D& d% X# I, k
- public class OracleConnectionTest {
% N$ x/ |$ I6 \! T! ^8 {( T2 } - private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnectionTest.class);( ^' o/ Z2 X# H$ ~0 \
8 ]; |1 I/ S& _0 f# O1 y4 |- @Autowired
' j; J' n/ G6 ]4 l' {8 e* A - private JdbcConfig jdbcConfig;
; w8 l; d: O, X' q - 3 b' ?# C9 e6 i$ U8 @! @
- @Test
% c q3 ~& |- k( ? S" l S0 l - public void testConnection() throws ClassNotFoundException {
! b1 Z" u3 l% m( @ - LOGGER.info("Test: {}", jdbcConfig.toString());
. m7 A i8 h6 r; F$ M- V8 |( @/ n, R
* H& Z0 {; f! a; Z, d7 N- Class.forName(jdbcConfig.getDriverClassName());9 n4 u$ W+ w* R% [. `
7 Q s! u7 }0 f4 {! G- try (Connection connection = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUsername(), jdbcConfig.getPassword())) {
3 `0 i4 h8 j4 m, }6 ~ - LOGGER.info(String.valueOf(connection));+ Y8 a1 ^) u8 D4 b5 }
- } catch (SQLException e) {9 h1 _4 Q* b+ h+ v5 E( [6 V6 ~
- LOGGER.error(String.valueOf(e));0 j: C. ^9 C" e6 |* {1 Q+ |, q
- }. D1 E. i6 w! m$ _' B# p
- }}
$ A6 s) e2 d/ R) e9 c0 ^ 但是,我遇到了 NullPointerException(JdbcConfig) 运行时 testConnection(). 所以我必须这样修改JdbcConfig类。
: N) O2 L/ ?4 E' [. u- @Getter3 E9 e, g8 _7 t% ?4 N
- @Setter5 b0 z0 L& }- X* ]: G
- @Component
& [! h$ L; H3 r$ ^ - @PropertySource("classpath:application.properties")3 M( x+ _- T t
- public class JdbcConfig {6 H; y3 i/ m& ^9 \, r" e5 h
- @Value("${spring.datasource.driver-class-name}"), W7 O7 c" j: {! u
- private String driverClassName;' n: G% {* X8 ^; Q
- @Value("${spring.datasource.url}")
/ i( {. k" f7 G9 i8 n; B/ H8 E* C: p - private String url;. F( o+ f" v, @: W
- @Value("${spring.datasource.username}")
; D1 j& r, n7 P) Z/ h5 o% S - private String username;
0 [# o( t l+ b, ^9 K - @Value("${spring.datasource.password}"). D3 H' ]' s4 }5 p, Q
- private String password;- J* l2 e6 n8 D9 r( I. ~# x) g0 t
' X$ O8 O1 f( k$ t X' B- @Override
8 H" R+ l1 N4 }- g6 R4 z5 }, s - public String toString() {
. L2 }' k; F8 B: M/ A z% o - return "JdbcConfig[" +
9 b% N4 J- e; [( U - "driverClassName=" + driverClassName
2 J* z& A7 c a# p1 b2 w X - + ", url=" + url
' k( y; M( I# b - + ", username=" + username
7 [' p# u( H6 g( L9 h - + ", password=" + password( s. Y) u' \3 ?) i N
- + "]";
( _# P8 n, U! Q' }5 p7 j y - }}
+ `; F) _7 [& b+ J; m4 b 我不明白为什么 @Configuration & @ConfigurationProperties 注解不适用。其次,我以为spring-boot会自动创建 DataSource(javax.sql.DataSource) 通过阅读 application.properties. 例如,我的朋友在没有创建DataSource bean(class)的情况下测试成功。但是我遇到了一个错误,就像下面的错误一样,所以我必须创建DataSource bean。. z# r- Q- i N% l. E( O2 W
- Unsatisfied dependency expressed through field 'ds'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available
L4 \" m7 O$ H- T0 ~ 所以我必须创建DataSource bean。我不知道为什么我朋友的代码不创建bean(DataSource)就能自动运行,而我却不一样。我的代码如下。# E3 ?# R6 V. a, |# |5 F( L' U- J
- @RunWith(SpringJUnit4ClassRunner.class)
5 @. }/ Q$ t" M- c' K/ h: v1 m: f; } - @ContextConfiguration(classes = DataSourceConfig.class)1 O$ R6 Q. ~0 @& l' W$ ?0 ]9 {6 @% i" V
- public class DataSourceTest {. _7 Y. |/ h& Q1 k5 m; G2 N" B
- private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceTest.class);
: d* H/ w+ F- [4 E" l6 N
% \! ~( @% G& F+ |- @Autowired9 O2 X- |3 V+ X! Q" n! i8 r
- private DataSource ds; // DataSource & DriverManagerDataSource
! L# I9 x! F6 v; @# g! M8 K9 h% X - 8 S6 w! m8 d( a
- @Test
$ w2 r8 k* _) l$ s - public void testConnection() throws Exception {; ?# M8 v- b3 a
- try (Connection con = ds.getConnection()) {: F3 x( f, O! `/ J# S
- LOGGER.info(String.valueOf(con));
4 A' U2 ]1 _1 {+ a: J X) K$ L - } catch (Exception e) {0 A: y7 b6 Z, o1 U0 ^, h
- e.printStackTrace();
0 W @/ P8 [% e$ l, L3 z; N. e h - }9 P6 ^- y, K' D+ q/ m% g1 ~ o* O/ b. {) V
- }5 u2 c8 g) M7 Q3 Z! ^* Z D$ f
- }! g+ r& l/ q5 p, k" Y
$ { Y8 q3 p' i5 J! d& D% n% X* \
- @Configuration V7 {( C6 p* y0 Z& {$ X1 @
- @Import(JdbcConfig.class)6 z$ }- z2 ^9 {' J
- public class DataSourceConfig {
6 k3 ?" `8 j# ~) `6 I; g - private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceConfig.class);
2 d9 d0 U2 _9 q, P5 M; C7 o9 s
7 p# b' p8 M# V! R- @Bean
+ v& Y) y9 o7 B" H, L' I" D - public DataSource dataSource(JdbcConfig jdbcConfig) {1 |: ]* p: J' k' T. f
- LOGGER.debug("Test: {}", jdbcConfig.toString());
0 h. _ B0 s% U% B: T3 H - DriverManagerDataSource dataSource = new DriverManagerDataSource();8 _9 Y; V y2 ?) N- u& k. O y
- dataSource.setDriverClassName(jdbcConfig.getDriverClassName());
, {9 o& |0 _2 I9 z9 x3 _5 M4 ~: y - dataSource.setUrl(jdbcConfig.getUrl());
Q! B7 y/ ^4 F* K' y3 L - dataSource.setUsername(jdbcConfig.getUsername());
, p6 {2 T, J' P1 \ { - dataSource.setPassword(jdbcConfig.getPassword());( O' C; b+ s, P, N$ F& i
- return dataSource;
" d0 X0 D9 S4 _2 R - }
* g2 K, f; t; v+ p - }0 R, J4 C# u8 K' j9 C( e% _
谢谢你阅读我的长文。添加一个属性文件(application.properties)6 B5 T: y1 Q) G; R. z9 G
- # JSP
# r6 K O q" G7 U) I - spring.mvc.view.prefix = /WEB-INF/jsp/
$ Z4 U/ }+ [1 _5 o ]; ` - spring.mvc.view.suffix = .jsp! p% B3 Z- x3 I& c- F
$ R% w. z' H8 S8 X3 v- # language setting! C* A; @9 D/ a4 E5 s3 H
- spring.http.encoding.charset = UTF-8
1 N' l, }4 N0 N# q2 a - spring.http.encoding.enabled = true6 H- }1 ~, m8 `2 n: n
- spring.http.encoding.force = true
# u$ P7 i/ M8 }3 m - }! q3 A7 E" \! b
- # Database Info
1 n0 o- h! F0 w5 W) | - spring.datasource.driver-class-name = oracle.jdbc.driver.OracleDriver; f5 G& a& f/ e8 m+ e* }
- spring.datasource.url = jdbcracle:thin127.0.0.1:1521rcl& ?% |6 f. b% l \6 e
- spring.datasource.username = user1spring.datasource.password = user1% F7 X% K( G1 B: r9 \( k( y
) p3 j7 v2 Y b4 v) j( [) c* t
/ H- ]8 _* S- @, d4 U6 I: I* J; T2 N7 D我知道答案 回答被采纳将会获得6 金钱 已有0人回答 |
|