kagamihogeの日記

kagamihogeの日記です。

Java

Testcontainers + Spring Boot 3.1 + Oracle XE

従来 Testcontainers とspring-bootを組み合わせる場合は @DynamicPropertySource で接続URLプロパティなどを置き換える処理がやや煩雑だった。しかし https://spring.io/blog/2023/06/23/improved-testcontainers-support-in-spring-boot-3-1 によると有名…

Spring Cloud Stream(RabbitMQ)でhello-worldレベルのconsumer

Spring Cloud StreamをRabbitMQと組み合わせて、RabbitMQ管理画面から文字列をpublishしてspringアプリケーションでconsumeするだけのサンプルを作成する。 ソースコード・手順 build.gradle https://start.spring.io/ でCloud Stream, Spring for RabbitMQ…

spring-integrationでcommons-ioを使用したファイルのtail

Spring Integrationでファイルのtailを実現する。デフォルトではOSのtailコマンドを実行するが、設定によりOS非依存のApache Commons IOに切り替えられる。今回はそのサンプルコードについて。 ソースコードなど build.gradle https://start.spring.io/ を使…

gradleのversion catalogでsubprojectで共通のバージョンを定義

JJUG CCC 2023 Spring で最近のGradleにはversion catalogというmultiple projectでバージョン定義を共有する仕組みがあるのを知った。その時に講演していた方のプレゼン資料は Gradleと仲良くなる第一歩 ~小規模PJから大規模PJへ~ にある。 https://docs.…

HTTP Interface(WebClient)のリトライ

build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.0.6' id 'io.spring.dependency-management' version '1.1.0' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly …

MyBatis ThymeleafのSQL Generator

MyBatis ThymeleafのSQL生成機能であるSQL GeneratorはMyBatisとは独立して使用できる。基本的には他のO\Rマッパーと共に使用する。今回はmybatis-thymeleaf単体で使用可能な事を示すためにあえて他の依存性は何も追加せずにSQL生成のみ試す。 ソースコード…

Spring Batch 5さわる

Spring Batchは5.0から色々な変更が入った事を最近知った。 docs.spring.io What's new in Spring Batch 5 from ikeyat www.slideshare.net なので、良くやる設定などでとりあえず触ってみる。何分初めてさわるバージョンなので間違ってる事書いていたら申し…

Spring SecurityのForm認証

Spring BootでSpring Securityを使う場合はauto-configurationで様々な設定が自動で行われ、そのサマリは 公式ドキュメントにある。よくあるForm認証はそこに設定を追加・修正で行う。また、デモ・開発用の設定が最初から有効なので何も設定無しでも一応の動…

Selenium Gridをdockerで使う

Selenium Gridをdockerコンテナでリモートブラウザを起動するやり方で使用する。 ソースコードと手順 docker-compose.yml DockerでSelenium Gridを構築してクロスブラウザテストを自動化するを参考にdocker-compose.ymlを作成する。 version: '3.8' services…

Apache Commons Poolのサンプル

object poolを自力で実装する機会は余りないが、Apache Commons Poolが便利な局面があったのでその使い方をメモしておく。 plugins { id 'java' id 'org.springframework.boot' version '3.0.0' id 'io.spring.dependency-management' version '1.1.0' } gro…

spring-bootのSOAP web serviceクライアント

Getting Started | Consuming a SOAP web serviceを基に、SOAP Webサービスから生成したクラスを使用してサービスにアクセスする。 事前準備 SOAP Webサービスは以前に作成したこちらを使用する。 kagamihoge.hatenablog.com 手順 gradle https://start.spri…

Eclipse + Payara + SOAP Web Service

検証用の適当なSOAP Web Serviceが必要になったので試しにPayaraで作成した時のメモ。 事前準備 各種ソフトウェアのダウンロード。 jdk - https://www.oracle.com/java/technologies/downloads/ - latestなら動くと思うが必要に応じて対応バージョンをチェッ…

WireMockのResponse Templatingでレスポンスを動的に書換

WireMockはresponse-templatingによりレスポンスを書き換えられる。以下にspring-bootの@SpringBootTestを前提にしたサンプルコード・使い方について書く。 ソースコード build.gradle plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spri…

DGS Frameworkのチュートリアルレベルをやる

DGS FrameworkはNetflixのGraphQLサーバのためのspring-bootベースのフレームワーク。https://netflix.github.io/dgs/getting-started/ のチュートリアルをやる。 やったこと build.gradle https://start.spring.io/ でベースを作ったあとにチュートリアルの…

Spring for GraphQLのチュートリアルレベルをやる

Spring for GraphQL のチュートリアルレベルの事をやる。 やったこと hello world相当 https://start.spring.io/ でgraphql, webの依存性を追加する。build.gradleは下記となる。 plugins { id 'org.springframework.boot' version '2.7.0' id 'io.spring.de…

WebTestClientによるintegration testの記述

spring-bootで作成するweb-apiのintegration test(以下IT)を記述するのにWebTestClientが使える。これは内部的にWebClientを使用する。同様にTestRestTemplateは内部的にRestTemplateを使用する。環境に応じて使い分けになる。今回はWebTestClientによるIT…

spring-boot + MockServer

spring-bootのweb-apiのintegration testでMockServerを使用する。 ソースコード build.gradle springとの連携用のmockserver-spring-test-listener-no-dependenciesの依存性を追加する。 plugins { id 'org.springframework.boot' version '2.6.6' id 'io.s…

spring-cloud-starter-contract-stub-runner(WireMock)によるintegration test

spring-bootで外部アクセスを伴うweb-apiのintegration testを記述する際は何らかのmock serverを必要とする。ここではmock serverにWireMockを使用し、また、spring-bootとWireMockの連携にSpring Cloud Contractを使用する。WireMock関連の記述は6. Spring…

javaのinitialCapacityの速度差

javaのHashMapなどはコンストラクタでinitialCapacityで指定できる。単純ループでputしたとき速度差が生じるかを見る。 環境 java 17.0.1 やったこと まず、ごく単純なループで固定文字列をputし続け、maxを100万と1000万と変えたときの速度を見てみる。 sta…

docker(WSL2) + Testcontainers + MySQL

WSL2上のdockerでMySQLを起動してユニットテストを記述する。Testcontainersでテスト時にコンテナを自動的に開始・終了をする。 環境 windows 10 WSL2 Ubuntu-20.04 Docker version 20.10.11 ソースコード Spring Initializr で「testcontainer」と入力すれ…

docker(WSL2) + Testcontainers + sftp

WSL2上のdockerでsftpサーバを起動してユニットテストを記述する。Testcontainersでテスト時にコンテナを自動的に開始・終了をする。 環境 windows 10 WSL2 Ubuntu-20.04 Docker version 20.10.11, ソースコード Spring Initializr で「testcontainer」と入…

spring-batchのMapJobRepositoryFactoryBeanがDeprecated

従来、メタテーブルを永続化しなくするためにMapJobRepositoryFactoryBeanを使う事があったがspring-batch v5.0で削除予定になったようだ。 * @deprecated as of v4.3 in favor or using the {@link JobRepositoryFactoryBean} * with an in-memory database…

javaでextendsの階層を大量に深くする

javaでextendsの階層を深くしまくったらどうなるか? 理論的な裏付けは特に行わず、とりあえずやってみたら何が起きるか、を見る。 環境 java version "16" 2021-03-16 やったこと こんな感じでひたすらextendsを重ねるクラスを生成し、コンパイルして実行し…

EnvironmentPostProcessorでEnvironment初期化処理をカスタマイズ

spring-bootのEnvironmentPostProcessorを実装する事でEnvironmentの初期化処理に後処理を追加可能になる。これでプロパティの初期化をカスタマイズできる。大抵のケースでExternalized Configurationを利用すればプロパティは問題無いが、それでは機能不足…

Testcontainers + Spring Boot + Oracle XE

Testcontainersを使用し、spring-bootのテスト開始時にoracle xeのdockerコンテナを起動してテスト終了時に停止する。 環境 Windows 10 Pro x64 docker desktop 3.1.0 事前準備 oracleのdocker まずdockerでoracleを起動可能にする。 kagamihoge.hatenablog.…

spring.kafka.consumer.auto-offset-resetの挙動確認

spring-kafkaのプロパティspring.kafka.consumer.auto-offset-resetの挙動の違いを確認する。 以下はorg.apache.kafka.clients.consumer.ConsumerConfig#AUTO_OFFSET_RESET_DOCの抜粋だけど https://kafka.apache.org/documentation/#consumerconfigs_auto.o…

spring-cloud-stream-binder-kafkaのdead-letter-queue

リファレンスとしては https://cloud.spring.io/spring-cloud-stream-binder-kafka/spring-cloud-stream-binder-kafka.html#kafka-dlq-processing のあたり。 plugins { id 'org.springframework.boot' version '2.4.0' id 'io.spring.dependency-management…

spring-kafkaでconsumerのエラー時にdead-letter-topicにpublish

リファレンスとしては https://docs.spring.io/spring-kafka/docs/current/reference/html/#dead-letters のあたり。consumerのエラー発生時に別のtopicにメッセージをpublishする。 plugins { id 'org.springframework.boot' version '2.3.4.RELEASE' id 'i…

spring-kafkaでoffset指定のconsumer

spring-kafkaでoffsetを明示的に指定してconsumerを起動する。ドキュメントとしては https://docs.spring.io/spring-kafka/docs/current/reference/html/#topicpartition-initial-offset が参考になる。 plugins { id 'org.springframework.boot' version '2…

Spring Bootでjsonプロパティをenumにデシリアライズとvalidation

各種パターン まず、動作確認用の適当なmainとcontrollerを作成する。 plugins { id 'org.springframework.boot' version '2.4.1' id 'io.spring.dependency-management' version '1.0.10.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAP…