かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot でメール送信する Web アプリケーションを作る ( その20 )( 気になった点を修正 )

概要

Spring Boot でメール送信する Web アプリケーションを作る ( その19 )( 送信済メール検索画面の作成2 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Doma が実行された SQL 文をログに出力しますが、log4jdbc-log4j2 で SQL ファイルを出力するので Doma の方では出力しないようにします。
    • Tomcat 起動中に SQL ファイルを修正しても反映されませんでした ( JRebel で起動していてもダメでした )。反映されるようにする方法があるか調査します。

ソフトウェア一覧

参考にしたサイト

  1. Doma - User Documentation - 設定
    http://doma.readthedocs.org/ja/stable/config/

手順

DomaSQL 文をログに出力しないようにする

SQL 文のログは INFO レベルで出力されているので、ERROR レベルのログのみ出力されるようにします。

  1. IntelliJ IDEA で 1.0.x-change-doma-loglevel ブランチを作成します。

  2. src/main/resources の下の logback-develop.xml, logback-product.xmlリンク先の内容 に変更します。

  3. 動作確認します。Gradle projects View から bootRun タスクを実行して Tomcat を起動します。

  4. ブラウザを起動し http://localhost:8080/mailsearch へアクセスします。画面が表示された後にログを確認すると、doma の INFO ログが出力されていないことが確認できます。

    f:id:ksby:20150617221448p:plain

  5. Run View で Ctrl+F2 を押して Tomcat を停止します。

  6. commit、GitHub へ Push、1.0.x-change-doma-loglevel -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-change-doma-loglevel ブランチを削除、をします。

Tomcat 起動中に修正した SQL ファイルが反映されるようにする

Doma の User Documentation の 設定 - SQLファイルのリポジトリ を見ると、Doma 用の Config インターフェースの実装クラスで getSqlFileRepository が返す SqlFileRepository インターフェースの実装クラスが GreedyCacheSqlFileRepository か NoCacheSqlFileRepository かでキャッシュされるか否かが分かれるようです。

develop モードの時のみ NoCacheSqlFileRepository を、それ以外は GreedyCacheSqlFileRepository を返すようにして、開発時は SQL ファイルがキャッシュされないようにします。

  1. IntelliJ IDEA で 1.0.x-nocache-doma-sqlfile ブランチを作成します。

  2. src/main/java/ksbysample/webapp/email/config の下の DomaConfig.javaリンク先の内容 に変更します。

  3. 動作確認します。Gradle projects View から bootRun タスクを実行して Tomcat を起動します ( develop モードです )。

  4. ブラウザを起動し http://localhost:8080/mailsearch へアクセスします。hanako@sample.com のデータが最初に表示されています。

    f:id:ksby:20150618070722p:plain

  5. Tomcat は起動したままで、src/main/resources/META-INF/ksbysample/webapp/email/web/mailsearch/MailsearchDao の下の selectCondition.sqlリンク先の内容 に変更します。

  6. 再度ブラウザから http://localhost:8080/mailsearch へアクセスします。修正した SQL ファイルが反映されて、今度は xxx@yyy.zzz のデータが最初に表示されました。

    f:id:ksby:20150618071157p:plain

  7. src/main/resources/META-INF/ksbysample/webapp/email/web/mailsearch/MailsearchDao の下の selectCondition.sql を元に戻します。

  8. build.gradle を リンク先の内容 に変更します。

  9. Ctrl+F5 を押して Tomcat を再起動します ( unittest モードです )。

  10. ブラウザから http://localhost:8080/mailsearch へアクセスします。hanako@sample.com のデータが最初に表示されています。

    f:id:ksby:20150619000052p:plain

  11. Tomcat は起動したままで、src/main/resources/META-INF/ksbysample/webapp/email/web/mailsearch/MailsearchDao の下の selectCondition.sqlリンク先の内容 に変更します。

  12. 再度ブラウザから http://localhost:8080/mailsearch へアクセスします。修正した SQL ファイルは反映されず、hanako@sample.com のデータが最初に表示されたままでした。

    f:id:ksby:20150619000344p:plain

  13. Run View で Ctrl+F2 を押して Tomcat を停止します。

  14. src/main/resources/META-INF/ksbysample/webapp/email/web/mailsearch/MailsearchDao の下の selectCondition.sql を元に戻します。

  15. build.gradle を元に戻します。

  16. commit、GitHub へ Push、1.0.x-nocache-doma-sqlfile -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-nocache-doma-sqlfile ブランチを削除、をします。

次回は。。。

もう少しいろいろ修正したり、試してみたりする予定です。

その後に、Windows で本番稼働させるためのディレクトリ作成、bat ファイル作成、サービス登録、jar ファイル配置、動作確認して完了にする予定です。

ソースコード

logback-develop.xml, logback-product.xml

logback-develop.xml

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>

    <!-- Spring MVC -->
    <logger name="org.springframework.web" level="DEBUG"/>

    <!-- log4jdbc-log4j2 -->
    <logger name="jdbc.sqlonly" level="DEBUG"/>
    <logger name="jdbc.sqltiming" level="INFO"/>
    <logger name="jdbc.audit" level="INFO"/>
    <logger name="jdbc.resultset" level="ERROR"/>
    <logger name="jdbc.resultsettable" level="ERROR"/>
    <logger name="jdbc.connection" level="DEBUG"/>

    <!-- Doma 2 -->
    <logger name="org.seasar.doma" level="ERROR"/>
</included>
  • <logger name="org.seasar.doma" level="ERROR"/> を追加します。

logback-product.xml

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>

    <!-- Doma 2 -->
    <logger name="org.seasar.doma" level="ERROR"/>
</included>
  • <logger name="org.seasar.doma" level="ERROR"/> を追加します。

DomaConfig.java

package ksbysample.webapp.email.config;

import org.apache.commons.lang3.StringUtils;
import org.seasar.doma.jdbc.Config;
import org.seasar.doma.jdbc.GreedyCacheSqlFileRepository;
import org.seasar.doma.jdbc.NoCacheSqlFileRepository;
import org.seasar.doma.jdbc.SqlFileRepository;
import org.seasar.doma.jdbc.dialect.Dialect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

@Component
public class DomaConfig implements Config {

    private DataSource dataSource;

    @Autowired
    private Dialect dialect;

    private SqlFileRepository sqlFileRepository;

    public DomaConfig() {
    }

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.dataSource = new TransactionAwareDataSourceProxy(dataSource);
    }

    @Autowired
    public void setSqlFileRepository(@Value("${spring.profiles.active}") String springProfilesActive) {
        // develop モードの時は SQL ファイルがキャッシュされないようにする
        if (StringUtils.equals(springProfilesActive, "develop")) {
            this.sqlFileRepository = new NoCacheSqlFileRepository();
        } else {
            this.sqlFileRepository = new GreedyCacheSqlFileRepository();
        }
    }
    
    @Override
    public DataSource getDataSource() {
        return this.dataSource;
    }

    @Override
    public Dialect getDialect() {
        return this.dialect;
    }

    @Override
    public SqlFileRepository getSqlFileRepository() {
        return this.sqlFileRepository;
    }

    @Configuration
    protected static class DomaBeanConfig {

        @Value("${doma.dialect}")
        private String domaDialect;

        @Bean
        public Dialect dialect()
                throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            return (Dialect) Class.forName(domaDialect).newInstance();
        }

    }

}
  • getSqlFileRepository メソッドを追加しますが、このメソッドSQL 実行時に毎回呼び出されるので、SqlFileRepository インターフェースの実装クラスのインスタンスは最初に1回だけ生成されるようにします。以下の点を変更します。
    • private SqlFileRepository sqlFileRepository; を追加します。
    • @Autowired public void setSqlFileRepository(@Value("${spring.profiles.active}") String springProfilesActive) { ... } を追加します。
    • getSqlFileRepository メソッドを追加します。

selectCondition.sql

order by em.to_addr desc
  • desc を追加してソート順を逆にします。

build.gradle

bootRun {
    jvmArgs = ['-Dspring.profiles.active=unittest']
}
  • developunittest に変更します

履歴

2015/06/20
初版発行。