
kotlin
Executable JAR のリソースを参照する
リソース取得なんてどうせgetResourceでしょとタカをくくっていたらハマってしまったので、ExecutableJAR(実行可能JAR)のリソース取得では、ここに気をつけようというのを残しておきます。環境要件Java8Kotlin1.3java-versionopenjdkversion"1.8.0_212"OpenJDKRuntimeEnvironmentCorretto-8.212.04.1(build1.8.0_212-b04)OpenJDK64-BitServerVMCorretto-8.212.04.1(build25.212-b04,mixedmode)サンプルコードhttps://github.com/yo1000/demo-config-props-vars/blob/master/src/main/kotlin/com/yo1000/demo/DemoApplicat2020.05.17
mk2data で Markdown からテストデータ構築
mk2dataという小さなモジュールを作りました。マークダウンを使って、テストデータのセットアップや検証ができるようになるものです。なんでこんなものを作ったのかと申しますと。DB周りのテストを書く場合に、データのセットアップや検証のために、INSERTやSELECTを発行して確認するシーン、けっこうあると思います。でもこれ、面倒じゃないですか。プロダクションコードではバリバリORM使うのに、テストではあんまり使っていなかったり、標準APIを使って直接SQL発行してデータ作ってたり。そして煩雑になったSQL発行処理に、データのサマリや説明をつらつらとコメントしたりする。かくいうわたしも、以下のようなことをしていたんですね。dataSource.connection.use{conn->conn.createStatement().use{stmt->/*|id|name|age|blood|2020.03.07
Kotlin typealiasの効果的な使いどころ
Kotlinに用意されているtypealiasですが、これは新たな型を作るわけではなく、単に別名を付けてクラスへの参照経路を複数用意してあげるだけのものです。完全に別の型になるというわけではなく、エイリアスとエイリアスを付けられた型同士には互換性があるため、value-objectのような使い方をするためのものではありません。では、どのような場面で使うのが効果的なのか。以下で例を見ていきます。同一名前空間上で同名のクラスを使いたい場合これはtypealiasを使うのにとても適しており、また度々遭遇する場面でもあります。typealiasを使う前と、使ったあとの例を比較してみます。typealiasを使わない場合ありがちな話ですが、異なるパッケージの同名クラスを同時に使用したい場合、通常は一方のクラスをFQCNで記述しなければなりません。importorg.springframework.u2019.09.08
KotlinでJPA使用時にデフォルトコンストラクタ要求を回避する
KotlinでJPAを使用する場合、エンティティクラスにデフォルトコンストラクタが存在しないと、以下のような例外がスローされます。org.springframework.orm.jpa.JpaSystemException:Nodefaultconstructorforentity::..;nestedexceptionisorg.hibernate.InstantiationException:Nodefaultconstructorforentity::..これはJPA実装のひとつであるHibernateが、エンティティクラスのインスタンス生成時に、引数付きコンストラクタではなく、デフォルトコンストラクタを使おうとするために発生する例外ですが、Kotlinでは、コンストラクタとプロパティを一緒に記述できるため、多くの場合デフォルトコンストラクタが用意されません。Kotlinでデフォルト2019.02.26
KotlinやJavaのファイルスキームURLをパスに変換する
fileスキームのURLを、ローカルファイルを参照可能なパスに変換しようとしたところ、単純な文字列操作以外の方法でこれを取り扱うのが、思ったよりも手こずったのでメモ。手こずったとはいえ、方法を知っていれば難しくはないのですが、知らなかったなあということで。環境要件OracleJava1.8.0_161Kotlin1.2.71ApacheMaven3.6.0$./mvnw-versionApacheMaven3.6.0(97c98ec64a1fdfee7767ce5ffb20918da4f719f3;2018-10-25T03:41:47+09:00)Mavenhome:~/.m2/wrapper/dists/apache-maven-3.6.0-bin/2dakv70gp803gtm5ve1ufmvttn/apache-maven-3.6.0Javaversion:1.8.0_161,ve2019.02.22
Spring Bootプロファイルの指定あれこれ
SpringBootにはプロファイルという、環境ごとの設定やBean構成のロードを切り替える機能があります。プロファイルは、名前ベースで切り替えることができ、とても直感的に使うことができて便利です。ところが少し変わったことをしようとすると、途端に躓いてしまう部分でもあるので、プロファイルをもう一歩踏み込んで使うためのポイントをいくつかまとめてみます。要件環境Java8Kotlin1.2.41SpringBoot2.0.4.RELEASE基本的な使い方以下のようなテストがあった場合に、userへ何がDIされるかをプロファイルを使って切り替えてみます。@RunWith(SpringRunner::class)@SpringBootTestclassDemoSpringProfileApplicationTests{@Autowiredlateinitvaruser:User@Testfunco2018.08.11
Kotlinでヒアドキュメント中の文字をエスケープ
Kotlinには変数展開機能があるため、$記号を使いたい場合エスケープが必要になる。ヒアドキュメントと通常の文字列でエスケープの方法が少し異なり、クセがあるのでメモ。要件環境今回の作業環境は以下のとおりです。Java8Kotlin1.2.41デモ通常の文字列内でのエスケープprintln("\${xyz}")//OK:${xyz}ヒアドキュメント内でのエスケープprintln("""\${xyz}""".trimIndent())//NG:CompileERRORprintln("""\$\{xyz\}""".trimIndent())//NG:\$\{xyz\}println("""${'$'}{xyz}""".trimIndent())//OK:${xyz}valdoller:Char='$';println("""${doller}{xyz}""".trimIndent())//OK2018.08.09
Keycloak 4とSpring Boot 2アプリの連携 - リソースサーバー
Keycloak4がリリースされたのに合わせてkeycloak-spring-boot-2-starterもリリースされたので、SpringBoot2との連携例を紹介しようという記事の2回目です。(1回目はこちら)https://github.com/yo1000/kc4-boot2-resource要件環境今回の作業環境は以下のとおりです。Java1.8Kotlin1.2.41SpringBoot2.0.3.RELEASEKeycloak4.0.0.Final認証認可フロー今回は、SSOクライアントが複数で、それぞれがリソースサーバーとリソースクライアントの関係にある認証の流れを確認していきます。以下のような認証フローをイメージしてください。KeycloakのセットアップKeycloak3から、Keycloak4への移行によって、基本的な使い方に大きな変更が生じないのは、構成が変わっても2018.06.24
Keycloak 4.0とSpring Boot 2.0アプリの連携 - 単一クライアント
つい先日、待ちに待ったKeycloak4がいよいよリリースされました。なぜ待っていたかというと、Keycloak4用の連携モジュールからはSpringBoot2に正式対応されるからなんですね。(Keycloak3用の連携モジュールはSpringBoot1系にしか対応していませんでした。)Keycloak3の頃からIssueはあがっておりましたが、Keycloak開発チームから、Keycloak4のリリースと一緒に対応するよ、といった回答がされており、これを待っておりました。やっと材料が出揃ったということで、さっそくこれらを連携させたサンプルを確認していきたいと思います。実現したいSSOのフローに応じて、2回に分けて書きます。なお、文章はサンプルプロジェクトの内容を追いながら書いていくので、以下も併せて確認してください。https://github.com/yo1000/kc4-boot2要2018.06.23
Springで外部APIをリクエストする場合のテスト
外部APIをリクエストしている機能のテストをしたい場合、Springでは、MockRestServiceServerを使います。MockRestServiceServerを使うと、RestTemplateがリクエストしたURL等の条件に応じて、期待したレスポンスを返すようにテストを構成できるようになります。また必要に応じて、モックされたリクエストが、正しく順番通りに使用されたかどうかも検証できます。なお、今回のサンプルコードは以下にあるので、こちらも参考に。https://github.com/yo1000/example.MockRestServiceServer/tree/master/MockRestServiceServer-client要件Java1.8.0_121Maven3.5.3Kotlin1.2.41SpringBoot1.5.12.RELEASE$./mvnw-vApa2018.06.09
MavenのactiveByDefaultにはクセがある
Mavenで複数のプロファイルを切替える場合に、そのデフォルトとして、プロファイルをマークするのがactiveByDefaultという設定なわけですが、これの挙動が少し想像とズレていたのでそのメモ。サンプルは以下。https://github.com/yo1000/example.Maven-ActiveByDefaults要件Java1.8.0_121Maven3.5.3$./mvnw-vApacheMaven3.5.3(3383c37e1f9e9b3bc3df5050c29c8aff9f295297;2018-02-25T04:49:05+09:00)Mavenhome:~/.m2/wrapper/dists/apache-maven-3.5.3-bin/2c22a6s60afpuloj4v181qvild/apache-maven-3.5.3Javaversion:1.8.0_1212018.06.09
KotlinでMockitoを使うとanyがうまくいかない
テストでMockitoを使っていると、any(Class<T>)を使いたくなる場面は、そこそこ多いように思います。ところが、Kotlinでテストを書いていると、これを受け取ったKotlin実装のメソッドで以下のようなエラーが吐かれてしまい、テストが書けません。java.lang.IllegalStateException:Mockito.any(Hoge::class.java)mustnotbenull調べてみると、近い内容でお困りのケースが見つかったので、これを参考に対応してみました。要件Kotlin1.2.21Mockito1.10.19対処法一度Kotlin実装された別のメソッドでラップしてあげて、Kotlinで実装されたメソッドに、Null安全な状態で渡してあげれば良いようでした。以下のようにします。@Testfuntest(){valinvokerMock=Mockito.mo2018.05.28
Jacksonシリアライズの循環参照を止める
Jacksonを使用したJSONの出力で、オブジェクトが循環参照を起こしているような場合、これを止める方法についてのメモ。以下のように、JsonIdentityInfoアノテーションをクラスにつけるだけで良いです。これを使用することで、循環が検出された場合に、循環しているオブジェクトの内容を、ID文字列に置き換えてくれるようになります。JPAエンティティなどをそのままJSON出力したいような場合には、OneToMany,ManyToOneを使用したオブジェクトの参照で、このようなニーズが度々発生します。@Entity@JsonIdentityInfo(property="_id",generator=ObjectIdGenerators.UUIDGenerator::class)dataclassPerson(@Idvarid:String="",varname:String="",@On2018.01.25
DynamoDB LocalをSpring Bootで使う
概要DynamoDBLocalを、SpringBootで使うメモ。SpringDataのCrudRepositoryを使用した、リポジトリクラスの定義と、自動生成や、SpringBootのAutoconfigurationの仕組みを組み合わせて、プロダクションと、テストで、データストアの使い分けができるようにしていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/ddb-local/tree/e9eb5812f6/ddb-local-spring-boot要件環境今回の作業環境は以下のとおりです。Java1.8.0_131Kotlin1.2.10DynamoDBSDK1.11.263DynamoDBLocal1.11.86SpringBoot2.0.0.M7$sw_versProductName:Ma2018.01.14
DynamoDB Localを使用したテスト
概要AmazonDynamoDBを、AWSに依存せず、ローカルでテストする流れのメモ。DynamoDBでは、AWSを利用せずとも、ローカルで検証できるように、AWS自身からDynamoDBLocalというモジュールが提供されています。このモジュールはAWSが管理しているMavenリポジトリにもホスティングされており、これを利用することで、事前に特別なコマンド等を発行することなく、JVM言語のビルドプロセス過程で、ローカルにDynamoDBを用意することができるようになります。このポストでは、Kotlinプロジェクトで、DynamoDBLocalを使用してテストする場合に、どのような設定が必要になるのかを中心に書いていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/ddb-local/tree/40c2018.01.13
KeycloakリソースサーバーJavascriptクライアントの連携例
概要Keycloakと、リソースサーバー、リソースクライアント間のSSO検証メモ。(Javascriptクライアント版)すでに検証部分の大半は過去のポストで完了しているため、ここでは主にJavascript版での差分と、Javascriptクライアントからの利用方法を中心に書いていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource/tree/e09c1dd987/kc-resource-client-js要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.FinalNodeJSv8.4.0NPM5.6.0$sw_versProductName:MacOSXProductVersion:10.2018.01.06
Keycloak認証を使うリソースサーバーのテスト
概要Keycloakによる認証を使う、リソースサーバー(SpringBootクライアント)でのテスト実装メモ。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource/584c4c92ce#try-testing-with-only-kc-resource-serverまた、テストコード以外の部分については、過去のポストを前提としています。関連するものについては軽く触れますが、詳細を確認したい場合は、そちらを確認してください。要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.Final$sw_versProductName:MacOSXProductVersion:10.12.5BuildVersion2017.12.25
Keycloakリソースサーバー リソースクライアントの連携例
概要KeycloakによるSSO基盤構築検証のメモ。SSOサーバー(Keycloak)のセットアップと、SSOクライアント(リソースサーバー、リソースクライアント)の開発を順に見ていきます。この手順で使用したコードは、以下に公開しているので、こちらも参考にしてください。https://github.com/yo1000/kc-resource要件環境今回の作業環境は以下のとおりです。Java1.8.0_131SpringBoot1.5.9.RELEASEKeycloak3.4.1.Final$sw_versProductName:MacOSXProductVersion:10.12.5BuildVersion:16F2073$java-versionjavaversion"1.8.0_131"Java(TM)SERuntimeEnvironment(build1.8.0_131-b11)J2017.12.17


