|
我有两个问题。首先,我在spring-boot中测试了db连接,如下图所示。
: n/ d2 v/ l& t/ D" K5 u- @RunWith(SpringJUnit4ClassRunner.class)
$ k' g) l. q- U+ _ - public class OracleConnectionTest {
& }( C- a1 ~+ ^; i - private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnectionTest.class);- i5 V, X) M! ?1 N# B& o
3 a* d' b) S6 ?' T6 U: E, p, G1 n- private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";6 g5 P! r1 o' _
- private static final String URL = "jdbc
racle:thin 127.0.0.1:1521 rcl";
0 X `8 d7 g0 {6 B - private static final String USER = "user1";& b* s8 v7 x0 Y
- private static final String PW = "user1";
% y& E7 U. ]: u - " c8 ?/ J2 W' |7 V
- @Test' B5 L' h5 q, K: k2 S3 Y/ E
- public void testConnection() throws ClassNotFoundException {* _6 I* N ]# s4 b; J
- Class.forName(DRIVER);! m0 l6 R3 d$ h3 U8 F
- , W8 n( r' \% J& ~) n+ z
- try (Connection connection = DriverManager.getConnection(URL, USER, PW)) {
8 C( y+ r7 e* j: o+ [$ V" O S9 | - LOGGER.info(String.valueOf(connection));
9 y9 G- C+ {7 t8 [! U# [+ x7 _4 M, u - } catch (SQLException e) {
: ?& y/ E |" q; ~. n# e1 z - LOGGER.error(String.valueOf(e));, @2 O5 F1 t; ^) J
- }6 h' L, B) z* f4 p; v! d
- }}/ [! d# G. N" T. ~/ t
但是我想把DB信息分离到application.properties文件(resourcesapplication.properties)中去,所以我需要制作JdbcConfig文件(java Bean)。所以我需要制作JdbcConfig文件(java bean),如下图所示(含测试代码)。5 Z: l$ U4 p: _3 @/ n+ ~
- @Getter
% r2 {6 {" W9 S! Y% { - @Setter
6 n4 B2 c$ s) E; y+ d: W - @Configuration5 T- J. i/ e u3 M i- x
- @ConfigurationProperties(prefix = "spring.datasource")
" d F9 }& |8 c3 I6 |, F - public class JdbcConfig {& f' z$ m( d# s9 C5 E: B! z
- @Value("${driver-class-name}")- y( N( q* |+ z& N
- private String driverClassName;
/ H3 r/ l. i2 G - @Value("${url}")
* i% ~& T9 |. g0 p5 {! r6 x - private String url;
) p4 N2 B1 G9 J5 N' t' q - @Value("${username}")2 O' M4 c0 ^3 g7 F7 [; Z3 s( o
- private String username;0 w" O$ ?1 A6 O) r5 _/ |5 |
- @Value("${password}")7 }4 |/ f+ N; S* w7 ~, K- p
- private String password;
' U2 Q3 {* ?5 {; D0 o
7 B8 h7 S! C; X; B$ t+ H) E* @( D% g+ P- @Override
# G, w( M: s O* X0 ?5 ?/ l$ a - public String toString() {
. v! N/ M: z8 G3 Q; t; L - return "JdbcConfig[" +* h. z6 K# E' b' o2 [* T# M
- "driverClassName=" + driverClassName8 u0 C8 X+ c" k8 D7 v0 O1 }
- + ", url=" + url" L& y/ }; H5 H4 l8 O* M) b
- + ", username=" + username
; l/ o/ |1 h3 _4 R, P$ G - + ", password=" + password8 e. o% b% n1 v$ A9 H" l( z
- + "]";
6 Y: |; b% \: `+ R5 D - }}) q$ T! l" l& U! V( W
4 I! d5 {9 V- t- q9 H5 c
- @RunWith(SpringJUnit4ClassRunner.class)4 x. U/ W' L2 w3 d @$ K! T
- @ContextConfiguration(classes = {JdbcConfig.class})
7 \+ h* W: [4 S' L* i+ t& A - public class OracleConnectionTest {5 \1 B0 b4 K: ~: Z* X. w) e" f
- private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnectionTest.class);0 X ^/ ~2 F" L: Z8 }7 k8 H
; V- P# r5 o$ `8 b$ h) F9 V- @Autowired
7 o" o; S _! O, H( ]9 H - private JdbcConfig jdbcConfig;
( p. P8 l9 }% ?7 c; V9 i - 9 [( ^& U- `$ z7 N: N2 D5 {9 @
- @Test
* S& A( T, ~2 n3 j - public void testConnection() throws ClassNotFoundException {
& ?9 b3 V, T# w6 Q! x5 H - LOGGER.info("Test: {}", jdbcConfig.toString());" N2 u8 F; S0 ?. J
- 2 s% s5 x0 X$ K/ f$ B. ^8 Y/ r+ I; i: D
- Class.forName(jdbcConfig.getDriverClassName());
! t; ~ Q$ H0 J! u - " Y+ x6 R0 f$ Q( i. `- Z+ ~! P D9 e
- try (Connection connection = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUsername(), jdbcConfig.getPassword())) {
/ x/ k" I# j. c& v& p3 @ - LOGGER.info(String.valueOf(connection));# y8 y, u! f2 \) N2 `2 I
- } catch (SQLException e) {$ H5 `& |3 g; F2 |- u
- LOGGER.error(String.valueOf(e));% p7 m1 \) U# Z! J) [5 n5 |
- }. ?/ B5 }: n3 [' e/ f; E! z5 V2 t
- }}
S- { P2 Q, z s# j 但是,我遇到了 NullPointerException(JdbcConfig) 运行时 testConnection(). 所以我必须这样修改JdbcConfig类。
) ?, L% y1 A* A% O7 t- @Getter
4 _8 c+ Q. k4 k: c/ g; S - @Setter; e% p8 e! p" ^; Z! o8 R
- @Component
. R, |6 h0 q' U - @PropertySource("classpath:application.properties")
! K: a& D+ |# ]7 G/ _9 t - public class JdbcConfig {
3 n. Q$ I! V% u& q- R% G$ _# [+ [ - @Value("${spring.datasource.driver-class-name}")
2 J2 n9 a; c1 s6 ~% o) ?" M: T - private String driverClassName;
8 L N1 j+ z& X - @Value("${spring.datasource.url}")
2 Y0 ^/ `% A$ X& v: s! L - private String url;
9 J& q" {! e+ I+ f% e6 j - @Value("${spring.datasource.username}")
8 G! a0 Q9 K( ?' s; b7 q - private String username;
) E0 a3 Y* `2 R) `! d - @Value("${spring.datasource.password}"), P" I/ H! Z$ u6 t; A% s6 v' |
- private String password;
/ R9 W' _3 ]" D
0 U3 p# S5 |; d3 E/ h- @Override
: o; A, w5 R2 t( R" [ - public String toString() {
, H( P1 C- T! U - return "JdbcConfig[" +' @$ [8 a/ ~5 H$ x" @7 m& C
- "driverClassName=" + driverClassName! G/ m& b! s# J+ f
- + ", url=" + url
4 [( c, j; s) u+ x+ M( y# R - + ", username=" + username
7 [- Z1 m: p N3 b. o - + ", password=" + password' p( A; o& U3 I9 ~9 ~4 m/ t
- + "]";
" V6 W3 u% _0 H9 N - }}6 `) i0 n; O' s: l6 z ]1 r* b
我不明白为什么 @Configuration & @ConfigurationProperties 注解不适用。其次,我以为spring-boot会自动创建 DataSource(javax.sql.DataSource) 通过阅读 application.properties. 例如,我的朋友在没有创建DataSource bean(class)的情况下测试成功。但是我遇到了一个错误,就像下面的错误一样,所以我必须创建DataSource bean。
9 Z; z4 D# g- M4 N$ P7 z- Unsatisfied dependency expressed through field 'ds'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available) A0 ?' f5 K( G7 u
所以我必须创建DataSource bean。我不知道为什么我朋友的代码不创建bean(DataSource)就能自动运行,而我却不一样。我的代码如下。
1 V3 E/ Y: u! f$ K; x- @RunWith(SpringJUnit4ClassRunner.class)1 g" u/ b9 Q# Q8 t; |$ z4 c4 K0 \
- @ContextConfiguration(classes = DataSourceConfig.class)
; G5 D$ W) W! T( z/ k" T2 j - public class DataSourceTest {
1 D" u0 P2 q* [5 D7 ~! b - private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceTest.class);: A6 z9 ^( |7 g5 a7 P$ @
b) _- i% S! R- @Autowired
1 r2 ]- S. n2 [( O# S - private DataSource ds; // DataSource & DriverManagerDataSource d$ l1 }; \* f6 ]
, m, D9 D3 Y5 m( x( g- @Test
9 J: V, u+ @. j3 ?5 x- b - public void testConnection() throws Exception {
2 N! P) O8 E2 s0 e; p; |# u - try (Connection con = ds.getConnection()) {( v D5 G/ f) o( }
- LOGGER.info(String.valueOf(con));9 v7 `* V# C: J+ c* s$ ^8 n
- } catch (Exception e) {
) a T* A- ~ J e; N - e.printStackTrace();4 J: d; w* \ P3 r
- }
( k# y. h1 J# K' d9 Q, G) n) { - }
- z& }9 y" l2 ?6 A! f6 h - }0 Y! \- Y/ o7 [
& j, ~' @0 w+ C" r
- @Configuration& R c( z6 h+ y" C& X; |
- @Import(JdbcConfig.class)* p" ]2 l$ |0 O5 o
- public class DataSourceConfig {& ]( e6 d; |, @$ Q5 C
- private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceConfig.class);* R2 x5 c, q; K; ]
, A7 ]- W, m1 q- @Bean
' q% s. U4 M- [8 d, M/ k - public DataSource dataSource(JdbcConfig jdbcConfig) {+ j8 X9 q& n d
- LOGGER.debug("Test: {}", jdbcConfig.toString());
5 W7 W z/ z1 \ t7 N) p. f8 E) H1 g! K - DriverManagerDataSource dataSource = new DriverManagerDataSource();/ x. ^. J4 B2 {$ U: p
- dataSource.setDriverClassName(jdbcConfig.getDriverClassName());5 G$ L6 ~+ Q# O- W3 L
- dataSource.setUrl(jdbcConfig.getUrl());$ L. [% z0 a9 b0 l8 y5 m; `
- dataSource.setUsername(jdbcConfig.getUsername());" q& [6 \( a0 ]: _) D& y. H
- dataSource.setPassword(jdbcConfig.getPassword());& X8 G- p; D q. ~! P
- return dataSource;
. `" x5 `" x1 O - }
2 B( |. K7 M6 C8 I+ b: |1 ]0 Z - }( b: [& M" {+ @7 @7 k
谢谢你阅读我的长文。添加一个属性文件(application.properties)5 V% Z7 M* t9 w2 V9 L
- # JSP
5 U! {. t$ v6 V9 ?& m O - spring.mvc.view.prefix = /WEB-INF/jsp/9 O% e [1 W8 Q+ i3 z0 e o
- spring.mvc.view.suffix = .jsp5 q; q1 l; D. u5 ?+ Q' J
" M; ^/ } ]1 ]! y2 n- # language setting0 ?3 A7 c: S$ P
- spring.http.encoding.charset = UTF-8$ T: V* h& C1 g/ L5 n" `
- spring.http.encoding.enabled = true
% E) L2 ~5 K* I. ?; l6 v! B - spring.http.encoding.force = true
9 _; u0 j- j+ R* N, ~0 j* ^
0 G0 u- U* Y4 _! C% p- # Database Info
0 P# |' `0 U* o D1 ` - spring.datasource.driver-class-name = oracle.jdbc.driver.OracleDriver
+ l1 C4 p3 {. `$ | - spring.datasource.url = jdbc
racle:thin 127.0.0.1:1521 rcl
1 T- n, a( @/ \" z j - spring.datasource.username = user1spring.datasource.password = user1
. v' R j" ^3 p3 [9 [' [) g
2 r3 T1 i0 R* g2 Q2 G P% s. y) [; `& j1 S. A* o C
我知道答案 回答被采纳将会获得6 金钱 已有0人回答 |
|