すきま風

勉強したことのメモとか

Spring Boot

Spring Integration Ftpのexists メソッドがどんなときもTrueを返す件について

なんてアホな子なのだ! 調べた DefaultのExists ModeはFTP STAT なのでここで判定している。 https://github.com/spring-projects/spring-integration/blob/main/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpRem…

Spring WebFlux × Kotlinで NoHandlerFoundException 対策をする

背景 Spring BootでRest APIを作る際、Spring MVCならNoHandlerFoundExceptionがあるため、設定していないURLにRequestが来た場合のハンドリングは ExceptionHandlerで簡単に実装できる。 @RestControllerAdvice class ErrorAdvice { @ExceptionHandler(valu…

Spring Boot WebFluxでThymeleafを使う

WebFluxのサンプルをネットで探すとAPIの例しか見つからなくて、俺はHTML出力したいんだよ!って思ったので自分で書きました。 Data Drivenは試していない Controller Spring MVC風のやつ。Rendering を返す。Kotlinならsuspend functionにするだけでReacti…

Spring Boot の bootBuildImage で custom runImageを利用する

以前、↓みたいな記事を書きました。 Cloud Native Buildpacksのrun:base-cnb に curlを入れたい - 秋の魔法使い Spring Bootのコードを読んで研究したところ、もっと一般的な解決方法に気づいたので記事にしておきます。 (普通にリファレンスにも書いてあっ…

Spring Boot 2.4.0 でMultiple Propertyファイルを適用させる

Spring Boot 2.4になって、application.ymlの書き方がちょっと変わったのでメモ。色々便利になったようなのですが、k8sとか使っていないのであんまり恩恵がない 基本設定をapplication-base.ymlに記述し、環境ごとの差異をそれぞれのapplication-xxx.ymlに…

Multi Module ProjectのSpring Boot × Kotlin Applicationにdetektを導入する

仕事で使うことになったので勉強しました 前回の記事 に適用します。 point ktlintはdetekt-formattingを利用する。そのためにmaven kotlinx repositoryを追加する multi moduleすべてを見るようにinput files を設定する checkでdetektも走るようにする bu…

Multi Module ProjectのSpring Boot × Kotlin ApplicationにgRPCを導入する

Clean Architecture (Multi Module Project) のSpring BootでgRPCを使えるようにします。 仕事で使いそうなので勉強しました。本当はGoで作りたかったけど、誰も賛同してくれなかった。人望/Zero 😉

Cloud Native Buildpacksのrun:base-cnb に curlを入れたい

はじめに この記事内容は古いので、こちらを参考にしてください。 Spring Boot の bootBuildImage で custom runImageを利用する - 秋の魔法使い 以下、せっかく書いたので残しておくもの AWSのECSでサービスディスカバリを構築する場合、 タスク定義にhealt…

Spring Boot の Web Applicationで Shift_Jis (あるいはUTF-8以外) のリクエストを受け取る

方法 application.properties以下のように設定する spring.http.encoding.force=false または spring.http.encoding.force-request=false 解説 Spring MVCはCharacterEncodingFilterでHttpServletRequest, HttpServletResponseのCharacterEncodingをoverride…

Cloud Native Buildpacksのpack CLIでSpring BootのFat Jarを起動するDocker Imageを作成する。 あるいはSpring Boot 2.3.0.M1 のlayeredをエミュレートする

この記事の内容 pack CLIでLayer ArchitectのSpring Boot ApplicationのDocker Imageを作成する 上記の目的のために、Spring Boot 2.3.0.M1のlayered()をエミュレートしたshell scriptを書く 実用性皆無のネタ記事です 😑

ぼくのかんがえたさいきょうのJib

現時点で考えたさいきょうのJib設定をメモしておきます。1週間の勉強での結論なのですぐに変わりそうですが コード内の、どうすっかなーみたいなコメントでお察しください。 Jibの記事は一旦これで終了にする予定です。 いままでの記事と同じく、multi-pro…

JibでSpring BootのFat Jarを利用する

Jib Version 2.0.0からFat Jarが正式にサポートされました! Release jib-gradle-plugin v2.0.0 · GoogleContainerTools/jib · GitHub ※ 1.8.0 時点ではFat Jarでの起動をデフォルトでサポートしていなかったので、ExtraDirectoryにJarをCopyしてEntryPoint…

JibでLayer architect な Spring Boot Applicationをdocker imageにする

Spring Boot ApplicationをDocker image化する手段として Cloud Native Build Pack Jib jdeps && jlinkで軽量なDocker imageを作る etc... 等があります。(あります、とか大上段からものを言っていますが、ここ1週間くらいで仕入れた知識です。私はクソ雑魚…

コンテナに存在するかわからないBeanをAutowiredする

Constructor Injection class Foo( private val bar: Bar? ) { } Field Injection class Foo { @Autowired(required = false) lateinit var bar: Optional<Bar> } 前回の記事に関連して小ネタ。@Autowired(required = false)を知らなかったのでメモ。 Constructor</bar>…

Spring Boot × Gradleで自作ライブラリを作る

Spring Bootで自作ライブラリを1から作ったことがなかったので試してみました。 作成するライブラリ 文字列を引数で与えるとPrefixをつけて返してくれるMyTextDecoratorを作成します。 さらにadditionalを定義することで追加で文字列を付けてくれます。 gith…

Configuration annotationのproxyBeanMethodsとBean Lite Modeについての備忘録

記事の概略 SpringのBeanにはBean Lite Modeというものがある Spring 5.2から@Componentの代わりに@Configuration(proxyBeanMethods = false)を指定することでBean Lite Modeにできる CGLIB Proxyが不要ならパフォーマンスがよくなる https://github.com/spr…

フロントエンド開発勉強日誌 4

フロントエンド開発勉強日誌の続きです。 Thymeleaf導入 TypeScriptの開発環境設定 npm-scripts Polyfillを設定する IE11とかの古いブラウザに対応するためにPolyfillを設定します。 core-jsとwhatwg-fetchを入れる Polyfillの設定をする webpack.config.js…

Spring Boot 2.2.1以降でWebClientを利用して巨大なResponseを受け取るとDataBufferLimitException が発生する

Spring Boot 2.2.1 (Spring 5.2.1) から、WebClientで256KBを超えるJsonを扱うと DataBufferLimitException が発生するようになりました。Spring 5.1.11 以降でも発生すると思います。 (こっちは自分で試していません) issueはこちら になります。詳細は公式…

build.gradle.ktsに移行する! Tips編

以前記事にしたプロジェクトをbuild.gradleからkotlin-dslに移行します。 build.gradle.ktsにすることでスクリプト内でKotlinを使えるようになるし、IntelliJの補完が賢くなるし、groovyの文法をいちいちググらなくてよくなります。Spring Initializrでのデ…

build.gradle.ktsに移行する! 変換編

以前記事にしたプロジェクトをbuild.gradleからkotlin-dslに移行します。プロジェクト構成などについてはそちらを参照ください。 Spring Boot 2.2.0のリリースに伴いコードを書き直しました (最終更新: 2019/11/14) ※ リンクの記事はspring-data-r2dbc など…

Kotlin Coroutineのerror handlingを理解する

Kotlin Fest 2019 での Kotlinコルーチンを理解しよう 2019 が素晴らしかったので、忘れないうちに復習することにします。 サンプルプログラムは前回記事にしたクリーンアーキテクチャのコードを利用しています。

Spring Boot2 × Kotlin × Gradle5でクリーンアーキテクチャのアプリケーションを構築する (実装編)

build.gradleまで書いた前回記事の続きです。Apiをcallした体のプログラムを記述します。

Spring Boot2 × Kotlin × Gradle5でクリーンアーキテクチャのアプリケーションを構築する

要旨 Gradleの勉強。クリーンアーキテクチャを実装してみます。 この記事ではgradleについて記述します。実際のコードについては次回記事を参照ください。 元ネタはSpring IO 2019で紹介されていたこちら 以前書いたレイヤーアーキテクチャのサンプルはこち…

JUnit5 で BDD

JUnit5のinner classを利用したBDD記法のサンプルです。 検証環境 software version OS MacOS Mojave Spring Boot 2.2.0.M4 Java Corretto-11.0.4.11.1 Kotlin 1.3.41 JUnit5 5.5.1

protobufをHTTP通信する

protocol bufferは通常gRPCで利用しますが、API定義をprotoファイルで行い 通信自体はHTTPで行いたい、というケースが実務でありましたので方法を記載します。 検証環境 software version OS MacOS Mojave Spring Boot 2.1.5 Java 1.8.0_192-b12 Kotlin 1.3.…

Spring Boot × MyBatis × HikariCPで複数データソースを動的 (透過的) に利用する方法

前置き 以前、静的な方法で複数データソースを利用する方法を記事にしました。 今回は透過的に複数データソースを利用する方法について記述します。 透過的とは、リクエスト時のユーザ情報とか、アクセス時間とか、何らかのパラメータを元にアクセスするデー…

Spring Boot起動時に環境毎の設定ファイルを利用する方法 3パターン

Spring Boot × Gradleで起動時に読み込む設定ファイルを切り替える方法を3種類記載します。 方法の概説 spring.profile.activeで起動時のapplication.yml (application.properties) を指定 build時に環境毎の設定ファイルディレクトリをclass pathに追加 起…

Spring Boot2 × MyBatis × HikariCPで複数データソースにアクセスするコードを実装する 静的バージョン

前置き MyBatisを利用した複数データソースの実装には データソースごとのmapperをpackageレベルで分割する静的な手法と、SpringのAbstractRoutingDataSource を使って都度利用するデータソースを決定する動的な手法があります。今回は静的な手法のコードを…

Spring Boot2 × Kotlin × Gradle5でレイヤーアーキテクチャのアプリケーションを構築する

要旨 Gradleマルチプロジェクトの勉強用です。Spring Boot2, Kotlin, Gradleを使ったシンプルなレイヤーアーキのサンプルです。 クリーンアーキテクチャの記事はこちら ソフトウェアバージョン software version OS MacOS Mojave Spring Boot 2.1.5 Java 1.8…