kagamihogeの日記

kagamihogeの日記です。

Spring Boot

spring-bootのTestcontainersで開発と結合テストのコンテナ設定を共有

Spring BootのService Connection を使ったTest containersの活用が全然浸透していないように思える。未だにTestcontainersをテストでしか使っていない場合は↓を見てほしい。https://t.co/awwtvJ34vk— Toshiaki Maki ( @ik.am) (@making) 2025年8月30日 spri…

spring-bootのRedisTemplateでkeyなどが\xac\xed\x00\x05になる原因と解決方法

現象 Spring Data RedisのRedisTemplateでstreamのkeyを正しく指定しているはずなのに想定通りに動作しない。下記のようなXREADGROUPコマンド相当を実行するとエラーになり、何故かkeyが文字化けしたエラーメッセージになる。 plugins { id 'java' id 'org.s…

spring-boot 3.4のStructured logging対応

チュートリアル相当 Spring Boot 3.4のstructured loggingサポート紹介エントリ https://spring.io/blog/2024/08/23/structured-logging-in-spring-boot-3-4 をひととおり試す。 plugins { id 'java' id 'org.springframework.boot' version '3.4.6' id 'io.…

spring-bootのプロパティファイル場所変更

以下抜粋の通り、spring-bootはデフォルトでは以下ディレクトリのapplication.propertiesないしapplication.yamlを読み込む。歴史的事情や、リファレンス中にもある通りKubernetes等の事情で、デフォルトの変更が望ましいケースがある。 From the classpath …

springのRestClientの使い方のメモ

https://docs.spring.io/spring-framework/reference/integration/rest-clients.html RestTemplateの後継であるRestClientの使い方について。とはいえ、おおよそは旧来のspringユーザならお馴染みなものが多く、リファレンスを見ればだいたいは事が足りる。…

spring-bootでOracleのIDENTITY列値の取得

たとえばoracleでは下記で連番を割り振れる。 CREATE TABLE sample_gen( id number GENERATED ALWAYS AS IDENTITY , value VARCHAR2(100) NOT NULL , CONSTRAINT sample_gen_pk PRIMARY KEY (id) ); import jakarta.persistence.Column; import jakarta.pers…

Oracle Database Advanced Queuingをさわる

https://docs.oracle.com/cd/E57425_01/121/ADQUE/aq_intro.htm 環境 Oracle Database 23ai Free Release 23.0.0.0.0 A5:SQL Mk-2 Version 2.20.0 docker run --name oracle_queue -p 11521:1521 -e ORACLE_PWD="Oracle23" container-registry.oracle.com/da…

springのSimpleJdbcCallでストアドプロシージャを呼び出す

springのDBアクセスにはJdbcTemplateが従来から存在しており、現在では後継のJdbcClientも利用可能である。ストアドプロシージャにはSimpleJdbcCallを使用する。 本エントリの注意点として、私はあまりOracleのストアドプロシージャに詳しくない。そのため用…

WebFluxでBindingResultをWebExchangeBindExceptionに書き換え

WebFluxではWebMVCのようにメソッド引数でBindingResultでvalidation結果を取得できないので、その書き換え方について。 WebMVCではcontrollerでvalidation結果を取得するにはメソッドの引数にBindingResultを追加する。例えば以下のようなコードになる。以…

spring-bootでControllerAdviceのExceptionHandlerが呼ばれるまでの流れ

spring-bootでは@ControllerAdvice / @RestControllerAdviceによりcontollerの例外処理を一か所にまとめられる。このエントリでは例外が発生してadviceのメソッドが実際に呼び出されるまでのコードを追う。 ソースコードのバージョンはこれを書いてる 2024/1…

Hibernate Validatorの実行順序と制御

概要 Hibernate Validatorで複数のconstraint annotationを指定順序で実行し、また、あるannotationが失敗したらそこでvalidationを終了する方法について。 背景 spring-boot-starter-validation というかHibernate Validatorはconstraint annotationにデフ…

spring-bootでlogstash-logback-encoderを使用してログをJSON形式にする

spring-boot 3.4以降 (2025/6/3 追記) https://kagamihoge.hatenablog.com/entry/2025/06/03/165344 基本的な使い方のサンプルコード plugins { id 'java' id 'org.springframework.boot' version '3.3.1' id 'io.spring.dependency-management' version '1.…

SpringBootTest + Testcontainersの親クラスで設定共通化による高速化

背景 Testcontainersでspring-bootのテストケースが増えると複数のクラスに分割したくなる。しかし、単純に複数のテストクラスを作成しただけだと、コンテナ(とspring-bootも)も複数個起動してしまいテストの実行時間が増えてしまう。 よって、Testcontain…

Testcontainers + Oracle Database 21c XEの初期化SQL実行

基本形 以降の記述は以下の基本形をベースに進めていく。 build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.3.0' id 'io.spring.dependency-management' version '1.1.5' } group = 'com.example' version = '0.0.1-SNAPSHOT' ja…

spring-boot 3.2 + Resilience4J

spring-boot + Resilience4J を試す。 事前準備 mockoon https://mockoon.com/ バックエンドAPIの挙動をあれこれ試すのに何らかのmockserverがあると便利。今回はGUIであれこれ変更しながら試すのに便利なmockoonを使用した。 ソースコードおよび解説 https:…

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-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 …

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認証はそこに設定を追加・修正で行う。また、デモ・開発用の設定が最初から有効なので何も設定無しでも一応の動…

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

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

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…

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」と入…