Java

JavaのString#replaceAllによる正規表現置換でも、$1などでグループ化した文字列を後方参照できる

タイトル通りだが、チーム内の誰もできるということを知らなかったのでメモ。 replaceAllでの後方参照 Groovyの場合 Kotlinの場合 振り返り replaceAllでの後方参照 タイトル通り、第1引数の検索文字列に ( ~ ) で囲んだグループを記述し、第2引数の置換文…

Hibenateで関連エンティティが存在しない場合の例外を抑制する

JPAの実装としてHibenateを使っている。 既存のテーブルに対して、新規にエンティティクラスを追加し、 @OneToOne で関連を追加したが、関連元のフィールドがnullを設定可能になっている。 その状態で関連元のエンティティを参照すると、該当のカラムがnull…

JavaのコレクションファクトリーメソッドやGuavaのImmutableCollectionは、nullを要素に使えない

Java9で追加された List#of などのファクトリーメソッドや、Java10で追加された Collectors#toUnmodifiableList などのイミュータブルなコレクション生成をよく使っているが、nullを含んだ値を指定したら NullPointerException が発生した。 標準APIやGuava…

Spring DATA Repositoryの@Queryによる検索の戻り値を、DTOやインターフェースにする

Spring DATAのJPA Repositoryを使っているが、戻り値をJPA Entity全体ではなく、任意のフィールドだけにしたいという話があった。 単純にSQLのように SELECT フィールド, フィールド... すると Object の配列になるが、それは避けて任意のDTOやインターフェ…

JPAのCriteriaBuilderでRDBMSの関数を使う

DBでは数値として持った値を、左0埋めして画面に表示していたが、そこを文字列として部分一致検索させることになった。 検索はSpringのSpecificationで、動的なJPQLをCriteriaBuilderで組み立てており、RDBMSの関数を使えないか調べたのでメモ。 やりたいこ…

JPAのCriteriaBuilderのconjunctionとdisjunctionについて

SpringのSpecificationなどで、動的なJPQLをCriteriaBuilderで、Predicateを組み立てるときに使う conjunction と disjunction 、毎回どっちがどっちか忘れるのでメモ。 conjunction disjunction 振り返り conjunction AND条件の起点。SQLに解釈されると 1 =…

Spring Data JPAのSpecificationでページング時にJOIN FETCHすると例外が発生する

@OneToMany でリレーションを設定したJPA Entityに対し、Spring Data JPAのSpecificationで動的クエリを発行している。 N+1問題の回避のため、 JOIN FETCH して findAll(Specification) で検索していたが、ページングすることとなり、 findAll(Specification…

Springの@Queryに列挙型のフィールドの値を埋め込む

特定の値しか入らないテーブルのカラムに対応する列挙型を用意し、フィールドとして値を保持している。 ORMとしてはJPA Entityを使用しているが、かなり古いソースなのでEnumeratedやConvertによる列挙型のフィールドマッピングなどは行われず、単純な int …

java.util.Dateを簡単にLocalDateやLocalDateTimeに変換する

Java8から java.time が標準APIに入ったが、それ以前に書かれたソースだったり、ライブラリとの兼ね合いで、まだまだ java.util.Date を扱う機会がある。 両方扱うときに困るのが変換方法で、だいたい検索すると LocalDateTime.ofInstant(date.toInstant(), …

Javaで画像の特定の色を透過させる

前回、アップロードされた画像の加工をJavaでやったところ、追加で「透過していない画像であれば、白背景を透過できないか」との要望が。 ちょっと試してみたところ、何とかなったのでメモ。 環境 実装 透過済みかの判定 特定の色を透過 実行サンプル 振り返…

Javaで画像の縦横比を維持してリサイズする

アップロードされた画像を特定の高さに揃える、みたいな作業をすることになった。 サムネイル画像など、表示用であればCloudinaryやimgixのような、リサイズ機能付きCDNサービスを使えばいいが、サーバー側で別途画像処理する必要があったので使えず。 Java…

Javaでバイトの単位(KB,MB,GB)をわかりやすくする

1 * 1024 * 1024 で1メガバイト、みたいなやつをよく見る。 コードレビューしていると、1000 だったり 1024 だったり、気を利かせて 1_024 と書かれていたり、たまに 124 とか 1240 とタイポしていたりと、結構揺らぎがち。また、KB/MB/GBかKiB/MiB/GiBか、…

JavaでMessageDigestにないハッシュ関数を使う

ユーザーの入力値から適当な文字列を生成する要件があった。 Javaで標準的に使えるハッシュ関数だとMD5やSHA1,2,3あたりになるが、計算速度は早いほうがいいということで、高速なハッシュ関数が使えないか調べてみたのでメモ。 環境 Javaで標準的に使えるハ…

Gradleのユニットテストを早くするためにやったこと

プロジェクト管理ツールにGradleを使ったSpring Bootプロジェクトのユニットテストを、GitLab CIのパイプラインで実行しているが、完了するのに45分程度かかっていた。 その後のデプロイなど含めると、トータル1時間程度かかってしまう。 短縮できないか調べ…

静的解析結果をGitHubのPRやGitLabのMRにコメントするViolationsツールの紹介

静的解析ツールを導入しているが、事前に解析結果をチェックしてといってもなかなか潰しきれない。 GitサーバーとしてGitLabを使っているので、マージリクエスト(GitHubなどのプルリクエストに相当、以下MR)でコードレビューを行っているが、静的解析結果をM…

Java11にしてIntellijからGradleユニットテストを実行するとcompileTestGroovyでClassNotFoundExceptionが発生する

Java8からJava11にアップデートをしたところ、Intellijからテスト実行ができなくなった。 Git Bashから ./gradlew test したり、コマンドプロンプトから gradlew.bat test すると問題なく実行できるので、Intellij起因の問題だろうと思って調べたが、かなり…

Spring Data JPAのRepositoryでクエリを自動生成するためのメソッド命名規約

Spring Data JPAで、 JpaRepository を継承したリポジトリインターフェースに対し、特定の命名規則でメソッドを宣言しておくと、 @Query アノテーションなど書かなくても処理を自動生成してくれる。 で、その命名規則、単純な検索処理であれば findAllByXxxI…

Javadocから作成したXMLを読み込み、クラスと突き合わせてファイル出力してみる

typescript-generatorプラグインでJavadocからTSDocを生成したのち、XMLを直接読み込んだらいろいろできそうだなと思いついた。 Enumの値のJavadocと、フィールドで設定された値を出力したい場合があり、試してみたらできたのでメモ。 やりたいこと 実装例 J…

権限設定を実装するため、Javaで使える認可ライブラリについて調べた

アカウントまたはグループに権限設定して、もろもろの属性に応じたアクセス制御を行うことになった。 システム管理者が参照・作成・更新・削除といった権限を含むロールを作成 システム管理者がトップレベルのリソース(ルートディレクトリ的なもの)を作成 シ…

毎回忘れる海外の全文検索SaaSサービスの名前「Algolia」と、ざっくり全文検索サービス紹介

GitLabの全文検索に使われていたり、Firebaseの全文検索に推奨されている、SaaSの全文検索サービスの名前を毎回忘れるのでメモ。 Algolia です。 2021/3/28現在では、公式ページの利用会社ロゴにSlackがあるなぁ。 使ってみたとかではなく、全文検索の話題の…

typescript-generatorにプリミティブ型を必須プロパティ(non null)にするオプションが追加されていた

以前書いた記事の段階では、 typescript-generator で requiredAnnotations を指定すると、プリミティブ型のフィールド/GetterについてもOptional Properties(null設定可能)扱いとなっていた。 2021年3月の更新で、プリミティブ型をまとめて必須(非null)にで…

typescript-generatorプラグインでJavadocからTSDocを生成する

以前調査したtypescript-generator、その後もパラメーター調整しながら使用しているが、困ったのがヒアドキュメント。 Java側ではJavadocでクラスやプロパティの説明を書いているが、生成したTypeScriptのインターフェース定義ファイルにはデフォルトだと出…

フィールドやメソッドに付与されたRetentionPolicy.CLASSのアノテーションをJavassistで実行時に判定する

lombok.NonNull やKotlinの val をコンパイルすると付与される org.jetbrains.annotations.NotNull など、 RetentionPolicy.CLASS のアノテーションを実行時に判定したい場面があった。 RetentionPolicy.CLASS の場合は、 RetentionPolicy.RUNTIME のように…

GradleでコンパイルするJavaのバージョンを指定するときはJavaVersion列挙型が使える

小ネタ。 GradleでJavaのコンパイルするバージョンなどを指定する際、お決まりで apply plugin: 'java' sourceCompatibility = 1.8 targetCompatibility = '1.8' のように記述するが、ここに列挙型が使える。 ただ、毎回クラス名が何だったか忘れるのでメモ…

Kotlinのchunkedのように、Javaでサイズ/要素数によるList分割をするにはGuavaかCommons Collectionsを使えばいい

Kotlinの Iterable#chunked が便利だな~と思っていた矢先、JavaでListを複数のリストに分割する機会があった。 検索すると独自の実装方法が上位に出てくるが、たぶんCommons CollectionsかGuavaに用意されてるだろうと思ったら、両方にあったのでメモ。 Kot…

GaugeのJava実装を試してみる

前回の続き。 Taikoを使ったJavaScriptによるテスト実装でもろもろ躓いたので、Javaによるテスト実装を試してみる。 環境 JDKのバージョンについて プロジェクトの作成 pom.xmlの修正 Java実装 WebDriver用のヘルパークラス 実行フック データの保存 ステッ…

WindowsでGradleのbootRunがCreateProcess error=206になるときの対応方法と、Kotlinで記述している場合の注意点

開発端末がmacOSだけのプロジェクトに、ひとりWindowsでアサインされた。 プロジェクト管理がGradle、フレームワークがSpring Boot、開発言語がJavaまたはKotlinだったので、さっそく gradlew.bat bootRun すると、 A problem occurred starting process 'co…

GradleでprocessResources時にシンボリックリンクを作成(Windows, macOS対応)

Spring Bootを使ったJavaプロジェクトで、 bootRun をしてから起動するまで数分かかっていた。 調べてみると、 processResources タスクで src/main/webapp/WEB-INF を build/build/resources/main/WEB-INF にコピーしていたが、 src/main/webapp/WEB-INF 配…

Javaでinstanceofの代わりに使えるClassクラスのメソッドはisInstanceとisAssignableFromだというメモ

タイトル通り。 使おうと思うたびに「 instanceof 演算子の代わりに使えるメソッドなんだっけ?」となるのでメモ。 環境 それぞれの使い方 instanceof 演算子 Class#isInstance(Object) Class#isAssignableFrom(Class) 注意点 振り返り 環境 OpenJDK 8 8.262.…

JavaクラスからTypeScriptのインターフェース定義を生成するtypescript-generator Maven/Gradleプラグインを試してみた

フロントエンドをTypeScriptで記述することとなり、リクエストやレスポンスで受け渡すデータもTypeScriptで型定義したいという要望がでてきた。 バックエンドはSpring Bootを使ったJavaアプリケーションで、ダブルメンテになると面倒。 JavaのクラスからType…