共有ライブラリを管理するために Sonatype の Nexus Repository Manager OSS を使用する ( その23 )( Spring Framework に依存するライブラリを作成する6 )
概要
- 今回の手順で確認できるのは以下の内容です。
- ksbysample-library-depend-spring を導入してもデフォルトでは動作せず、ksbysample.library.request-and-response-logger.enabled=true を設定した時だけ動作するように変更します。
参照したサイト・書籍
目次
- RequestAndResponseLoggerAutoConfiguration クラスで ksbysample.library.request-and-response-logger.enabled=true が設定されていなければ Bean を生成しないようにする
- Nexus に登録する
- ksbysample-webapp-demo プロジェクトで動作を確認する
- 次回は。。。
手順
RequestAndResponseLoggerAutoConfiguration クラスで ksbysample.library.request-and-response-logger.enabled=true が設定されていなければ Bean を生成しないようにする
ksbysample-library-depend-spring プロジェクトを開きます。
バージョンを 1.1.0-RELEASE に変更します。build.gradle を リンク先の内容 に変更します。
src/main/java/ksbysample/library/dependspring/config の下の RequestAndResponseLoggerAutoConfiguration.java を リンク先の内容 に変更します。
テストします。src/test/java/ksbysample/library/dependspring/config の下の RequestAndResponseLoggerAutoConfigurationTest.java を リンク先の内容 に変更します。
テストを実行します。RequestAndResponseLoggerAutoConfigurationTest クラスのクラス名の左側に表示されているアイコンをクリックしてコンテキストメニューを表示後「Run 'RequestAndResponseLoggerAutoCo...'」を選択します。
テストは全て成功し、デフォルト状態ではログは出力されず、
ksbysample.library.request-and-response-logger.enabled=true
を定義すればログが出力されることが確認できます。
Nexus に登録する
clean タスク実行 → Rebuild Project 実行をした後 build タスクを実行して、エラーが出ないことを確認します。
Gradle projects View から uploadArchives タスクを実行します。BUILD SUCCESSFUL が表示されて正常に Nexus に登録されました。
Nexus の管理画面を見ると、登録されていることが確認できます。
ksbysample-webapp-demo プロジェクトで動作を確認する
ksbysample-library-depend-spring プロジェクトを閉じて ksbysample-webapp-demo プロジェクトを開きます。
build.gradle を リンク先のその1の内容 に変更します。変更後、Gradle projects View の左上にある「Refresh all Gradle projects」ボタンをクリックして反映します。
bootRun タスクを実行して Tomcat を起動した後、http://localhost:8080/sample にアクセスします。まだ
ksbysample.library.request-and-response-logger.enabled=true
を設定していないので、request, response のログが出力されません。Tomcat を停止します。
build.gradle を リンク先のその2の内容 に変更します。
再度 bootRun タスクを実行して Tomcat を起動した後、http://localhost:8080/sample にアクセスします。今度は request, response のログが出力されます。
Tomcat を停止します。
動作確認が完了したので、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-RELEASE
→1.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 用メソッドをcontains
→doesNotContain
へ変更します。 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-RELEASE
→1.1.0-RELEASE
に変更します。
■その2
dependencies { .......... } bootRun { jvmArgs = ['-Dksbysample.library.request-and-response-logger.enabled=true'] }
履歴
2016/12/29
初版発行。