kagamihogeの日記

kagamihogeの日記です。

Java

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のストアドプロシージャに詳しくない。そのため用…

dockerでS3互換のMinIOを起動してJavaからアクセス

概要 ローカル開発環境のdockerでS3を起動してJavaからアクセスする。 MinIO https://min.io/ を使用する。dockerhubは https://hub.docker.com/r/minio/minio サンプルコード docker run とりあえず最低限の動作確認を行うためのコマンド。 docker run -p 9…

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にデフ…

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