回答

收藏

如何在spring-boot中用application.properties制作config类?6金钱.anslist

技术问答 技术问答 335 人阅读 | 0 人回复 | 2023-09-11

我有两个问题。首先,我在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 = "jdbcracle:thin127.0.0.1:1521rcl";
    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 = jdbcracle:thin127.0.0.1:1521rcl
    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人回答
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则