かんがるーさんの日記

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

共有ライブラリを管理するために Sonatype の Nexus Repository Manager OSS を使用する ( その23 )( Spring Framework に依存するライブラリを作成する6 )

概要

共有ライブラリを管理するために Sonatype の Nexus Repository Manager OSS を使用する ( その22 )( Spring Framework に依存するライブラリを作成する5 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • ksbysample-library-depend-spring を導入してもデフォルトでは動作せず、ksbysample.library.request-and-response-logger.enabled=true を設定した時だけ動作するように変更します。

参照したサイト・書籍

目次

  1. RequestAndResponseLoggerAutoConfiguration クラスで ksbysample.library.request-and-response-logger.enabled=true が設定されていなければ Bean を生成しないようにする
  2. Nexus に登録する
  3. ksbysample-webapp-demo プロジェクトで動作を確認する
  4. 次回は。。。

手順

RequestAndResponseLoggerAutoConfiguration クラスで ksbysample.library.request-and-response-logger.enabled=true が設定されていなければ Bean を生成しないようにする

  1. ksbysample-library-depend-spring プロジェクトを開きます。

  2. バージョンを 1.1.0-RELEASE に変更します。build.gradle を リンク先の内容 に変更します。

  3. src/main/java/ksbysample/library/dependspring/config の下の RequestAndResponseLoggerAutoConfiguration.javaリンク先の内容 に変更します。

  4. テストします。src/test/java/ksbysample/library/dependspring/config の下の RequestAndResponseLoggerAutoConfigurationTest.javaリンク先の内容 に変更します。

  5. テストを実行します。RequestAndResponseLoggerAutoConfigurationTest クラスのクラス名の左側に表示されているアイコンをクリックしてコンテキストメニューを表示後「Run 'RequestAndResponseLoggerAutoCo...'」を選択します。

    テストは全て成功し、デフォルト状態ではログは出力されず、ksbysample.library.request-and-response-logger.enabled=true を定義すればログが出力されることが確認できます。

    f:id:ksby:20161229135551p:plain

    f:id:ksby:20161229135709p:plain

Nexus に登録する

  1. clean タスク実行 → Rebuild Project 実行をした後 build タスクを実行して、エラーが出ないことを確認します。

    f:id:ksby:20161229140148p:plain

  2. Gradle projects View から uploadArchives タスクを実行します。BUILD SUCCESSFUL が表示されて正常に Nexus に登録されました。

    f:id:ksby:20161229140424p:plain

  3. Nexus の管理画面を見ると、登録されていることが確認できます。

    f:id:ksby:20161229140616p:plain

ksbysample-webapp-demo プロジェクトで動作を確認する

  1. ksbysample-library-depend-spring プロジェクトを閉じて ksbysample-webapp-demo プロジェクトを開きます。

  2. build.gradle を リンク先のその1の内容 に変更します。変更後、Gradle projects View の左上にある「Refresh all Gradle projects」ボタンをクリックして反映します。

  3. bootRun タスクを実行して Tomcat を起動した後、http://localhost:8080/sample にアクセスします。まだ ksbysample.library.request-and-response-logger.enabled=true を設定していないので、request, response のログが出力されません。

    f:id:ksby:20161229142752p:plain

    Tomcat を停止します。

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

  5. 再度 bootRun タスクを実行して Tomcat を起動した後、http://localhost:8080/sample にアクセスします。今度は request, response のログが出力されます。

    f:id:ksby:20161229144016p:plain

    Tomcat を停止します。

  6. 動作確認が完了したので、commit します。また feature/3-issue ブランチを develop, master ブランチへマージして、Issue #3 をクローズします。

次回は。。。

  • Nexus 3 の正式版 ( 3.1 以降 ) のインストールは 3.0.x からのバージョンアップとして記述していたので、Windows版Nexus のインストール方法をまとめ直します。
  • VirtualBox+Vagrant をインストールして Linux の仮想サーバを構築し、Unix 版の Nexus Repository Manager OSS をインストールして使用してみます。

ソースコード

ksbysample-library-depend-spring/build.gradle

group 'ksbysample.library'
version '1.1.0-RELEASE'
  • version の値を 1.0.0-RELEASE1.1.0-RELEASE に変更します。

RequestAndResponseLoggerAutoConfiguration.java

package ksbysample.library.dependspring.config;

import ksbysample.library.dependspring.intercepter.RequestAndResponseLogger;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RequestAndResponseLoggerAutoConfiguration {

    private static final String REQUESTMAPPING_EXPRESSION = "@annotation(org.springframework.web.bind.annotation.RequestMapping)";

    @Value("${ksbysample.library.request-and-response-logger.execution:}")
    private String execution;

    @Bean
    @ConditionalOnWebApplication
    @ConditionalOnProperty(value = {"ksbysample.library.request-and-response-logger.enabled"}, havingValue = "true")
    public Advisor requestAndResponseLoggerAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        String expression = StringUtils.EMPTY;
        if (StringUtils.isNotBlank(this.execution)) {
            expression = this.execution + " && ";
        }
        expression += REQUESTMAPPING_EXPRESSION;
        pointcut.setExpression(expression);
        return new DefaultPointcutAdvisor(pointcut, new RequestAndResponseLogger());
    }

}
  • @ConditionalOnProperty(value = {"ksbysample.library.request-and-response-logger.enabled"}, havingValue = "true") を追加します。

RequestAndResponseLoggerAutoConfigurationTest.java

package ksbysample.library.dependspring.config;

import ksbysample.library.dependspring.Application;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.OutputCapture;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(Enclosed.class)
public class RequestAndResponseLoggerAutoConfigurationTest {

    public static abstract class TestBase {

        public MockMvc mvc;

        @Autowired
        private WebApplicationContext context;

        @Rule
        public OutputCapture capture = new OutputCapture();

        @Before
        public void setUp() throws Exception {
            this.mvc = MockMvcBuilders.webAppContextSetup(this.context)
                    .build();
        }

    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    public static class デフォルトの設定でのテスト extends TestBase {

        @Test
        public void ログが出力されない() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).doesNotContain("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).doesNotContain("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @TestPropertySource(properties = {
            "ksbysample.library.request-and-response-logger.enabled=true"
    })
    public static class enabledプロパティ設定時のテスト extends TestBase {

        @Test
        public void ログが出力される() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).contains("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).contains("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @TestPropertySource(properties = {
            "ksbysample.library.request-and-response-logger.enabled=true"
            , "ksbysample.library.request-and-response-logger.execution=execution(* ksbysample.library.dependspring..*.*(..))"
    })
    public static class executionプロパティ設定時のテスト_出力される設定 extends TestBase {

        @Test
        public void ログが出力される() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).contains("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).contains("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @TestPropertySource(properties = {
            "ksbysample.library.request-and-response-logger.enabled=true"
            , "ksbysample.library.request-and-response-logger.execution=execution(* ksbysample.webapp.lending.web..*.*(..))"
    })
    public static class executionプロパティ設定時のテスト_出力されない設定 extends TestBase {

        @Test
        public void ログが出力されない() throws Exception {
            mvc.perform(get("/test"))
                    .andExpect(status().isOk());
            assertThat(capture.toString()).doesNotContain("[req][info  ] REQUEST_URI = /test");
            assertThat(capture.toString()).doesNotContain("[res][info  ] RESPONSE_STATUS = 200");
        }

    }

}
  • 各クラスで同じ内容を定義をしていた部分を TestBase クラスを作成して共通化します。abstract class にしてテスト対象外になるようにします。
  • 「デフォルトの設定でのテスト」テストクラスのメソッド名を ログが出力されるログが出力されない へ変更し、メソッド内で使用している assert 用メソッドを containsdoesNotContain へ変更します。
  • ksbysample.library.request-and-response-logger.enabled=true を定義した時にログが出力されることを確認するための「enabledプロパティ設定時のテスト」テストクラスを作成します。
  • 「executionプロパティ設定時のテスト出力される設定」「executionプロパティ設定時のテスト出力されない設定」テストクラスの @TestPropertySource アノテーションksbysample.library.request-and-response-logger.enabled=true を追加します。

ksbysample-webapp-demo/build.gradle

■その1

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')

    compile('ksbysample.library:ksbysample-library-simpleutils:1.0-RELEASE')
    compile('ksbysample.library:ksbysample-library-depend-nospring:1.1-RELEASE')
    compile('ksbysample.library:ksbysample-library-depend-spring:1.1.0-RELEASE')
}
  • ksbysample.library:ksbysample-library-depend-spring のバージョン番号を 1.0.0-RELEASE1.1.0-RELEASE に変更します。

■その2

dependencies {
    ..........
}

bootRun {
    jvmArgs = ['-Dksbysample.library.request-and-response-logger.enabled=true']
}

履歴

2016/12/29
初版発行。