かんがるーさんの日記

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

Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( その4 )( Project の作成 )

概要

Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( その3 )( RabbitMQ ( Windows 版 ) のインストール ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Project の作成

参照したサイト・書籍

目次

  1. はじめに
  2. IntelliJ IDEA の起動、Project の作成
  3. Project View の「Compact Empty Middle Packages」のチェックを外す
  4. build.gradle の編集、反映
  5. Settings ダイアログでの設定変更
    1. 「Editor」->「File Encodings」で文字コードを UTF-8 に変更する
    2. native2ascii を有効にする
    3. 「Enable annotaion processing」をチェックする
    4. Gradle 実行時の文字コードを UTF-8 にする
    5. Gradle が使用する JVM を Project の JVM に合わせる
    6. YAML ファイルを編集時に行末の空白を自動で取り除かないようにする
  6. Project language level を設定する
  7. JUnit によるテスト実行時の spring.profiles.active と文字コードを設定する
  8. templates ディレクトリの作成
  9. ksbysample-webapp-email, ksbysample-webapp-basic からファイルをコピーする
  10. Spring MVC View に URL 一覧を表示するための設定
  11. Tomcat の起動、停止の確認
  12. GitHub へのアップロード
  13. 1.0.x ブランチの作成

手順

はじめに

IntelliJ IDEA の Gradle Projet の作成方法が一部変更されましたので、ksbysample-webapp-email で記載した手順を転記しつつ、まとめ直します。

またこの記事を書いている時に Spring Boot の 1.2.5 がリリースされました。今回は最初から 1.2.5 を使用します。他のライブラリも最新のバージョンを使用します。

IntelliJ IDEA の起動、Project の作成

  1. IntelliJ IDEA を起動します。他の Project を開いている場合には、メイン画面のメニューから「File」->「Close Project」を選択して Project をクローズします。

  2. 「Welcome to IntelliJ IDEA」画面が表示されます。画面中央の「Create New Project」をクリックします。

  3. 「New Project」画面が表示されます。画面左側のリストから「Gradle」を選択し、画面右側は以下の画像の状態にして「Next」ボタンをクリックします。

    f:id:ksby:20150701222242p:plain

  4. GroupId、ArtifactId、Version を入力する画面が表示されます。以下の点を変更した後、「Next」ボタンをクリックします。

    • 「GroupdId」に "project" を入力します。
    • 「ArtifactId」に "ksbysample-webapp-lending" を入力します。

    ※「ArtifactId」に入力した文字列がディレクトリ名になります。C:\project-springboot\ksbysample-webapp-lending の赤文字の部分です。

    f:id:ksby:20150704065032p:plain

  5. Gradle の設定をする画面が表示されます。以下の点を変更した後、「Next」ボタンをクリックします。

    • 「Create directories for empty roots automatically」をチェックします。

    f:id:ksby:20150701223224p:plain

  6. Project name、Project location を入力する画面が表示されます。「Finish」ボタンをクリックします。

    ※ここで「Project name」を変更してはいけません。

    f:id:ksby:20150701223729p:plain

  7. IntelliJ IDEA のメイン画面が表示されます。最初に Gradle が実行されて src ディレクトリが作成されるので ( メイン画面の下にメッセージが表示されています )、src ディレクトリが表示されるまで待ちます。Gradle の処理が終了すると Project View に表示されるディレクトリ構造は以下のようになります。

    ※src/main/java や src/test/java に以下の画像のように色が付いていることを確認します。

    f:id:ksby:20150704065237p:plain

Project View の「Compact Empty Middle Packages」のチェックを外す

  1. Project View の「Compact Empty Middle Packages」のチェックを外します。

    f:id:ksby:20150701234053p:plain

build.gradle の編集、反映

  1. build.gradle を リンク先の内容 に変更します。ksbysample-webapp-email の build.gradle から以下の点を変更しています。

    • Ultimate Edition で Spring Boot プロジェクトを作成した時に build.gradle に出力されていたものの内、反映した方がよさそうなものを入れています。
    • dependencies 内でバージョン番号を指定しているライブラリは jcenter で最新のバージョンを調べて修正しています。
  2. Gradle projects View の左上にある「Refresh all Gradle projects」アイコンをクリックして、変更した build.gradle の内容を反映します。

    f:id:ksby:20150701225933p:plain

Settings ダイアログでの設定変更

  1. メイン画面のメニューから「File」->「Settings...」を選択して「Settings」ダイアログを表示します。

「Editor」->「File Encodings」で文字コードUTF-8 に変更する

  1. Project Encoding を UTF-8 に設定します。画面左側で「Editor」->「File Encodings」を選択後、画面右側に「Project Encoding」の設定項目が表示されますので「windows-31j」→「UTF-8」に変更します。

    f:id:ksby:20150704065826p:plain

native2ascii を有効にする

  1. そのまま「Editor」->「File Encodings」の画面で、画面右側下部に「Properties Files (*.properties)」の設定項目が表示されていますので、以下の点を変更します。

    • 「Default encoding for properties files」を「<System Default> (now windows-31j)」→「UTF-8」に変更します。
    • 「Transparent native-to-ascii conversion」をチェックします。

    f:id:ksby:20150703005348p:plain

「Enable annotaion processing」をチェックする

  1. lombok を使用するのに必要な設定を有効にします。画面左上の検索フィールドに "Annotation" と入力すると画面左側のツリーの一番下に「Annotaion Processors」が表示されるのでそれを選択した後、画面右側に表示される「Enable annotaion processing」をチェックします。

    f:id:ksby:20150703010010p:plain

Gradle 実行時の文字コードUTF-8 にする

  1. Gradle の文字コードVM options で指定します。画面左上の検索フィールドに "Gradle" と入力した後、画面左側のツリーの一番下に表示される「Gradle-Android Compiler」を選択します。画面右側に「VM Options」の欄がありますので、ここに -Dfile.encoding=UTF-8 を入力します。

    f:id:ksby:20150704052346p:plain

Gradle が使用する JVM を Project の JVM に合わせる

  1. Gradle が使用する JVM を Project の JVM に合わせます。画面左上の検索フィールドに "Gradle" と入力して画面左側のツリーから「Build, Execution, Deployment」-「Build Tools」-「Gradle」を選択した後、画面右側の「Gradle JVM」で「Use Project JDK」を選択します。

    f:id:ksby:20150704052728p:plain

YAML ファイルを編集時に行末の空白を自動で取り除かないようにする

  1. YAML ファイルを編集する時に IntelliJ IDEA が行末の空白を自動で取り除かないよう設定を変更します。画面左側のツリーから「Editor」-「General」を選択後、画面右側の下部にある「Strip trailing spaces on Save」で「None」を選択します。

    f:id:ksby:20150704053057p:plain

「OK」ボタンをクリックして「Settings」ダイアログを閉じます。

Project language level を設定する

  1. メイン画面のメニューから「File」->「Project Structure...」を選択して「Project Structure」ダイアログを表示します。

  2. Project language level を「SDK default」に設定します。画面左側のツリーから「Project Settings」-「Project」を選択し、画面右側で「Project language level」の設定を「SDK default」へ設定後「OK」ボタンをクリックして「Project Structure」ダイアログを閉じます。

    f:id:ksby:20150704053949p:plain

JUnit によるテスト実行時の spring.profiles.active と文字コードを設定する

  1. メイン画面のメニューから「Run」-「Edit Configurations...」を選択します。

  2. JUnit によるテスト実行時の spring.profiles.active の値 ( unittest ) と文字コード ( UTF-8 ) を設定します。「Run/Debug Configuraitons」ダイアログが表示されます。左側のツリーで「Defaults」-「JUnit」を選択した後、右側の画面の「VM options」の末尾に -Dspring.profiles.active=unittest -Dfile.encoding=UTF-8 を追加します。追加後「OK」ボタンをクリックしてダイアログを閉じます。

    f:id:ksby:20150704054338p:plain

templates ディレクトリの作成

  1. Project View で src/main/resources の下に templates ディレクトリを作成します。

  2. 作成した templates ディレクトリの下に .gitkeep ファイルを作成します。

ksbysample-webapp-email, ksbysample-webapp-basic からファイルをコピーする

  1. 以下の画像の階層のパッケージを作成します。

    f:id:ksby:20150704074405p:plain

  2. ksbysample-webapp-email から以下のファイルをコピーします。

    ※リンクのあるファイルはリンク先の内容に変更します。

    ■src/main/java

    • src/main/java/ksbysample/webapp/email/Application.java
      → src/main/java/ksbysample/webapp/lending/Application.java
    • src/main/java/ksbysample/webapp/email/config/ApplicationConfig.java
      → src/main/java/ksbysample/webapp/lending/ApplicationConfig.java
    • src/main/java/ksbysample/webapp/email/config/Constant.java
      src/main/java/ksbysample/webapp/lending/Constant.java
    • src/main/java/ksbysample/webapp/email/config/DomaConfig.java
      → src/main/java/ksbysample/webapp/lending/DomaConfig.java
    • src/main/java/ksbysample/webapp/email/helper/PagenationHelper.java
      → src/main/java/ksbysample/webapp/lending/helper/page/PagenationHelper.java
    • src/main/java/ksbysample/webapp/email/annotation/dao/ComponentAndAutowiredDomaConfig.java
      → src/main/java/ksbysample/webapp/lending/util/doma/ComponentAndAutowiredDomaConfig.java
    • src/main/java/ksbysample/webapp/email/util/SelectOptionsUtils.java
      → src/main/java/ksbysample/webapp/lending/util/doma/SelectOptionsUtils.java
    • src/main/java/ksbysample/webapp/email/util/VelocityUtils.java
      → src/main/java/ksbysample/webapp/lending/util/velocity/VelocityUtils.java

    ■src/main/resources

    ■src/test/java

    • src/test/java/ksbysample/webapp/email/test/CustomModelResultMatchers.java
      → src/test/java/ksbysample/common/test/CustomModelResultMatchers.java
    • src/test/java/ksbysample/webapp/email/test/ErrorsResultMatchers.java
      → src/test/java/ksbysample/common/test/ErrorsResultMatchers.java
    • src/test/java/ksbysample/webapp/email/test/MailServerResource.java
      → src/test/java/ksbysample/common/test/MailServerResource.java
    • src/test/java/ksbysample/webapp/email/test/TableDataAssert.java
      → src/test/java/ksbysample/common/test/TableDataAssert.java
    • src/test/java/ksbysample/webapp/email/test/TestDataLoader.java
      → src/test/java/ksbysample/common/test/TestDataLoader.java
    • src/test/java/ksbysample/webapp/email/test/TestDataLoaderResource.java
      → src/test/java/ksbysample/common/test/TestDataLoaderResource.java
    • src/test/java/ksbysample/webapp/email/test/TestDataResource.java
      → src/test/java/ksbysample/common/test/TestDataResource.java
    • src/test/java/ksbysample/webapp/email/test/TestDataResource.java
      src/test/java/ksbysample/common/test/TestDataResource.java
    • src/test/java/ksbysample/webapp/email/test/TestHelper.java
      → src/test/java/ksbysample/common/test/TestHelper.java

    ■その他

    • /.gitignore
      → /.gitignore
  3. ksbysample-webapp-basic から以下のファイルをコピーします。

    ※リンクのあるファイルはリンク先の内容に変更します。

    ■src/main/java

    ■src/test/java

    • src/test/java/ksbysample/webapp/basic/test/SecurityMockMvcResource.java
      → src/test/java/ksbysample/common/test/SecurityMockMvcResource.java
  4. ファイルコピー後は以下のディレクトリ構成になります。

    f:id:ksby:20150704093352p:plain

    f:id:ksby:20150704093514p:plain

    f:id:ksby:20150704093611p:plain

Spring MVC View に URL 一覧を表示するための設定

※Ultimate Edition 限定の設定です。Spring Boot でメール送信する Web アプリケーションを作る ( 番外編 )( IntelliJ IDEA の Spring MVC View に URL 一覧を表示する ) を参照してください。手順が長いので転記しません。

※設定完了後のディレクトリ構成、「Project Structure」ダイアログの設定、dispatcher-servlet.xml, web.xml の内容を記載しておきます。

f:id:ksby:20150704100909p:plain

f:id:ksby:20150704100957p:plain

f:id:ksby:20150704101043p:plain

Tomcat の起動、停止の確認

PostgreSQL が起動していない場合には起動しておきます。

  1. Gradle projects View から bootRun タスクを実行します。起動して "Started Application in ..." のログが出力されることを確認します。

  2. Ctrl+F2 を押して Tomcat を停止します。

GitHub へのアップロード

  1. メイン画面のメニューから「VCS」->「Import into Version Control」->「Share Project on GitHub」を選択します。

  2. 「Share Project on GitHub」ダイアログが表示されます。「Description」を記入して「Share」ボタンをクリックします。

    f:id:ksby:20150704151747p:plain

  3. 「Add Files For Initial Commit」ダイアログが表示されます。何も変更せずに「OK」ボタンをクリックします。

  4. チェックされたファイルが GitHub へアップロードされます。成功するとメイン画面の左下に「Successfully shared project on GitHub」のメッセージが表示されます。

  5. ブラウザを起動し、https://github.com/ksby にアクセスします。「Popular repositories」欄に ksbysample-webapp-lending が表示されていることを確認した後、ksbysample-webapp-lending リンクをクリックします。

  6. https://github.com/ksby/ksbysample-webapp-lending へ遷移します。ページ下部にある「Add a README」ボタンをクリックします。

  7. README の編集画面が表示されるので適宜編集した後、ページ下部の「Commit new file」ボタンをクリックします。

  8. https://github.com/ksby/ksbysample-webapp-lending へ戻り、README.md が作成されていることを確認します。

  9. 画面上部の「Edit」リンクをクリックして「Description」を「ファイルアップロード・ダウンロード、Cookie、セッション、Spring Session、WebAPI、Spring Security、RabbitMQ連携のサンプル」へ変更します。

  10. IntelliJ IDEA のメインメニューから「VCS」-「Update Project...」メニューを選択します。「Update Project」ダイアログが表示されたら何も変更せずに「OK」ボタンをクリックします。

1.0.x ブランチの作成

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

  2. GitHub へ Push します。

ソースコード

build.gradle

buildscript {
    ext {
        springBootVersion = '1.2.5.RELEASE'
    }
    repositories {
        jcenter()
        maven { url "http://repo.spring.io/repo/" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-plugin:0.5.1.RELEASE")
        // for Grgit
        classpath("org.ajoberstar:grgit:1.1.0")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'

// for Doma 2
// JavaクラスとSQLファイルの出力先ディレクトリを同じにする
processResources.destinationDir = compileJava.destinationDir
// コンパイルより前にSQLファイルを出力先ディレクトリにコピーするために依存関係を逆転する
compileJava.dependsOn processResources

jar {
    baseName = 'ksbysample-webapp-lending'
    version = '1.0.0-SNAPSHOT'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

eclipse {
    classpath {
        containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
        containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

configurations {
    domaGenRuntime
}

repositories {
    jcenter()
}

dependencies {
    def jdbcDriver = "org.postgresql:postgresql:9.4-1201-jdbc41"

    // spring-boot-gradle-plugin によりバージョン番号が自動で設定されるもの
    // Appendix E. Dependency versions ( http://docs.spring.io/spring-boot/docs/current/reference/html/appendix-dependency-versions.html ) 参照
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-velocity")
    compile("org.springframework.boot:spring-boot-starter-mail")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.codehaus.janino:janino")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("org.springframework.security:spring-security-test:4.0.1.RELEASE")
    testCompile("org.yaml:snakeyaml")

    // spring-boot-gradle-plugin によりバージョン番号が自動で設定されないもの
    compile("${jdbcDriver}")
    compile("org.seasar.doma:doma:2.3.1")
    compile("org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16")
    compile("org.apache.commons:commons-lang3:3.4")
    compile("org.projectlombok:lombok:1.16.4")
    compile("com.google.guava:guava:18.0")
    testCompile("org.dbunit:dbunit:2.5.1")
    testCompile("com.icegreen:greenmail:1.4.1")

    // for Doma-Gen
    domaGenRuntime("org.seasar.doma:doma-gen:2.3.1")
    domaGenRuntime("${jdbcDriver}")
}

bootRun {
    jvmArgs = ['-Dspring.profiles.active=develop']
}

test {
    jvmArgs = ['-Dspring.profiles.active=unittest']
}

// for Doma-Gen
task gen << {
    def rootPackageName = 'ksbysample.webapp.lending'

    ant.taskdef(resource: 'domagentask.properties',
            classpath: configurations.domaGenRuntime.asPath)
    ant.gen(url: 'jdbc:postgresql://localhost/lendingdb', user: 'lending_user', password: 'xxxxxxxx') {
        entityConfig(packageName: "${rootPackageName}.entity", useListener: false)
        daoConfig(packageName: "${rootPackageName}.dao")
        sqlConfig()
    }

    // 自動生成したファイルを git add する
    def grgit = org.ajoberstar.grgit.Grgit.open(dir: project.projectDir)
    grgit.add(patterns: ['.'])
}

Constant.java

package ksbysample.webapp.lending.config;

public class Constant {
}
  • 定数を定義するクラスです。現時点では何も定義しません。

application.properties

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
doma.dialect=org.seasar.doma.jdbc.dialect.PostgresDialect

spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

spring.velocity.enabled=false
spring.velocity.charset=UTF-8

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" rollback-for="Exception" timeout="3"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointcutService" expression="execution(* ksbysample.webapp.lending..*Service.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutService"/>
    </aop:config>

</beans>
  • <aop:pointcut id="pointcutService" expression="execution(* ksbysample.webapp.email..*Service.*(..))"/><aop:pointcut id="pointcutService" expression="execution(* ksbysample.webapp.lending..*Service.*(..))"/> へ変更します。

application-develop.properties

spring.datasource.url=jdbc:log4jdbc:postgresql://localhost/ksbyemail
spring.datasource.username=ksbyemail_user
spring.datasource.password=xxxxxxxx
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

spring.mail.host=localhost
spring.mail.port=25

spring.messages.cache-seconds=0
spring.thymeleaf.cache=false
spring.velocity.cache=false
  • DB の設定は一旦そのままにします。
  • 今回の Project で不要な設定を削除します。

application-product.properties

server.tomcat.basedir=C:/webapps/ksbysample-webapp-lending

spring.datasource.url=jdbc:postgresql://localhost/ksbyemail
spring.datasource.username=ksbyemail_user
spring.datasource.password=xxxxxxxx
spring.datasource.driverClassName=org.postgresql.Driver

spring.mail.host=localhost
spring.mail.port=25

spring.thymeleaf.cache=true
  • server.tomcat.basedir の設定を変更します。
  • DB の設定は一旦そのままにします。
  • 今回の Project で不要な設定を削除します。

application-unittest.properties

spring.datasource.url=jdbc:postgresql://localhost/ksbyemail
spring.datasource.username=ksbyemail_user
spring.datasource.password=xxxxxxxx
spring.datasource.driverClassName=org.postgresql.Driver

spring.mail.host=localhost
spring.mail.port=25

spring.thymeleaf.cache=true
  • DB の設定は一旦そのままにします。
  • 今回の Project で不要な設定を削除します。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <property name="LOG_FILE" value="C:/webapps/ksbysample-webapp-lending/logs/ksbysample-webapp-lending.log"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <if condition='"${spring.profiles.active}" == "develop"'>
        <then>
            <include resource="logback-develop.xml"/>
        </then>
    </if>
    <if condition='"${spring.profiles.active}" == "unittest"'>
        <then>
            <include resource="logback-unittest.xml"/>
        </then>
    </if>
    <if condition='"${spring.profiles.active}" == "product"'>
        <then>
            <include resource="logback-product.xml"/>
        </then>
    </if>
</configuration>
  • <property name="LOG_FILE" value="C:/webapps/ksbysample-webapp-email/logs/ksbysample-webapp-email.log"/><property name="LOG_FILE" value="C:/webapps/ksbysample-webapp-lending/logs/ksbysample-webapp-lending.log"/> へ変更します。

messages_ja_JP.properties

AbstractUserDetailsAuthenticationProvider.locked=入力された ID はロックされています
AbstractUserDetailsAuthenticationProvider.disabled=入力された ID は使用できません
AbstractUserDetailsAuthenticationProvider.expired=入力された ID の有効期限が切れています
AbstractUserDetailsAuthenticationProvider.credentialsExpired=入力された ID のパスワードの有効期限が切れています
AbstractUserDetailsAuthenticationProvider.badCredentials=入力された ID あるいはパスワードが正しくありません

typeMismatch.java.math.BigDecimal=数値を入力して下さい。
typeMismatch.java.lang.Long=数値を入力して下さい。

TestDataResource.java

package ksbysample.common.test;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.csv.CsvDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.rules.ExternalResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.List;

@Component
public class TestDataResource extends ExternalResource {

    private final List<String> BACKUP_TABLES = Arrays.asList(
            "xxxxxxxx"
            , "xxxxxxxx"
    );

    private final String BACKUP_FILE_NAME = "ksbylending_backup";

    @Autowired
    private DataSource dataSource;

    private File backupFile;
    
    @Override
    protected void before() throws Exception {
        IDatabaseConnection conn = null;
        try {
            conn = new DatabaseConnection(dataSource.getConnection());

            // バックアップを取得する
            QueryDataSet partialDataSet = new QueryDataSet(conn);
            for (String backupTable : BACKUP_TABLES) {
                partialDataSet.addTable(backupTable);
            }
            ReplacementDataSet replacementDatasetBackup = new ReplacementDataSet(partialDataSet);
            replacementDatasetBackup.addReplacementObject("", "[null]");
            backupFile = File.createTempFile(BACKUP_FILE_NAME, "xml");
            try (FileOutputStream fos = new FileOutputStream(backupFile)) {
                FlatXmlDataSet.write(replacementDatasetBackup, fos);
            }

            // テストデータに入れ替える
            IDataSet dataSet = new CsvDataSet(new File("src/test/resources/testdata"));
            ReplacementDataSet replacementDataset = new ReplacementDataSet(dataSet);
            replacementDataset.addReplacementObject("[null]", null);
            DatabaseOperation.CLEAN_INSERT.execute(conn, replacementDataset);
        } finally {
            if (conn != null) conn.close();
        }
    }

    @Override
    protected void after() {
        try {
            IDatabaseConnection conn = null;
            try {
                conn = new DatabaseConnection(dataSource.getConnection());

                // バックアップからリストアする
                if (backupFile != null) {
                    IDataSet dataSet = new FlatXmlDataSetBuilder().build(backupFile);
                    ReplacementDataSet replacementDatasetRestore = new ReplacementDataSet(dataSet);
                    replacementDatasetRestore.addReplacementObject("[null]", null);
                    DatabaseOperation.CLEAN_INSERT.execute(conn, replacementDatasetRestore);
                }
            } finally {
                if (backupFile != null) {
                    Files.delete(backupFile.toPath());
                    backupFile = null;
                }
                try {
                    if (conn != null) conn.close();
                } catch (Exception ignored) {
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
  • テーブル名がまだ未定なので、BACKUP_TABLES のデータは全て xxxxxxxx に変更しておきます。
  • BACKUP_FILE_NAME の値を ksbylending_backup に変更します。

WebSecurityConfig.java

package ksbysample.webapp.lending.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import javax.sql.DataSource;

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 認証の対象外にしたいURLがある場合には、以下のような記述を追加します
                // 複数URLがある場合はantMatchersメソッドにカンマ区切りで対象URLを複数列挙します
                // .antMatchers("/country/**").permitAll()
                .anyRequest().authenticated();
        http.formLogin()
                .loginPage("/")
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/xxxxxxxx")
                .failureUrl("/")
                .usernameParameter("id")
                .passwordParameter("password")
                .permitAll()
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/")
                .deleteCookies("JSESSIONID")
                .invalidateHttpSession(true)
                .permitAll();
    }

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery("select id, password, enabled from user where id = ?")
                .authoritiesByUsernameQuery("select id, role from user_role where id = ?")
                .passwordEncoder(new BCryptPasswordEncoder());
    }

}

dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="ksbysample.webapp.lending.web" />

</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

履歴

2015/07/04
初版発行。