回答

收藏

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

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

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

本版积分规则