ひさびさにSpringを触ってドツボにはまったできごと

こんにちは。1か月に一つはブログを書きたいmp_hskです。

今日は、仕事で久しぶりに触ったSpring Freamworkではまったポイントをメモ。

JDBCTemplatがAutowiredできない!

今回は古臭い感じでSQLを書かなきゃならない要件があったので、JdbcTemplateを使ってDAOを実装しようといたが、アプリの起動で注入に失敗しまくった。

Profileをデバッグモードにしてログを見てみると、どうもJdbcTemplate内でつかってる DataSourceのBeanがみつからないらしい。

なんでや?application.ymlにはちゃんと設定しとるやろ!

spring:

  datasource:

    url: jdbcurl

    username: user

    password: pass

色々試してみたけど自分の環境ではdatasourceのオートコンフィグレーションが働いていなかったっぽい。

なんでコンフィグレーションクラスを作ったらうまくいった。

(HikariCPを使って実装)

@Configuration

public DataBaseConfig{

  @Bean

   public DataSource dataSource{

        HikariConfig config = new HikariConfig();

        config.setJdbcUrl(url);

        config.setUserName(user);

        config.setPassWord(password);

         return new HikariDataSource(config);

   }

}

 Hikari CPについては以下の記事がわかりやすい。

[Java]HikariCPでMySQL/SQLiteに接続してみる | 純規の暇人趣味ブログ

 

トランザクションロールバックされない

Serviceクラスに@Transactinalを付けトランザクション制御しようとしたが

Exceptionを発生させてもロールバックされない。

これは調べてみたら単純で、今の仕様だと@Transactinalではデフォルトでは非検査例外(RuntimeExceptionのサブクラス)しかロールバックされないらしい。

普通のExceptionでもロールバックする場合は以下のようにすればいい。

@Transactinal(rollbackFor=Exception.class)

LIKE検索のワイルドカード指定法

LIKEのワイルドカードを指定しつつ、入力パラメータはバインド変数でサニタイズするって部分で無駄に悩んだ。

これは強引に、ワイルドカード文字列とバインド変数を文字列結合することで解決。

String sql = "SELECT * FROM TABLE WHERE AAA LIKE " 

                + "'%' || ? || '%''";

// PostgreSQLを使ってるので'%'とバインド変数を || で連結 

こんな感じでうまくいった。

 

まぁこんかなんじでちょこちょこはまったけど、昔に比べるとずいぶん設定ファイルが減って楽になった印象を受けた。みんな少しずつ進化しているなぁ。