SpringBoot x GradleをIntelliJで開発するときは、IntelliJからGradleのタスクを起動する

エキサイト株式会社メディア事業部エンジニアの佐々木です。メディア事業部では、SpringBoot、Gradle、IntelliJでリビルド開発を日々行っています。Dockerを使ったローカル環境での開発を行っています。開発でのSpringBootの起動方法は複数ありますので、3つ…

SpringBootでコンテナイメージの作成をする

エキサイト株式会社メディア事業部エンジニアの佐々木です。メディア事業部ではSpringBootで開発しています。SpringBootには標準でDockerFileなしでコンテナイメージを生成してくれる機能があるので、ご紹介します。 はじめに コンテナイメージ作成 まとめ …

複数のIntelliJのプロジェクトをタブにまとめるちょっとしたTips

結論 前提 設定方法 やってみて 最後に エキサイト株式会社エンジニアの佐々木です。立場上、複数のプロジェクトをIntelliJで立ち上げることが多く、Windowがバラバラになってしまい使いにくかったんで、技術ブログに書くほどではない小さなTipsですが、調べ…

プロジェクト/リポジトリごとにJVMのバージョンを切り替える

エキサイト株式会社メディア事業部エンジニアの佐々木です。 メディア事業部では、最近JVMを利用した開発が増えてきており、プロジェクトやリポジトリごとにバージョンが変わったりが起きています。これをなるべく自動で切り替える方法をご紹介します。 前提…

SpringBootのInterceptorでテンプレートをモバイルとデスクトップでわける

エキサイト株式会社のエンジニアの佐々木です。SpringBootとThymeleafを使ってリビルドしていますが、既存テンプレートがモバイル用とデスクトップ用でわかれているので、Interceptorを使って対応します。 前提 SpringBoot x Gradleを使います。 build.gradl…

build.gradle内でIntelliJのGroovyの補完を効かせる

エキサイト株式会社メディア開発の佐々木です。build.gradle内でIntelliJのGroovyの補完を効かせる方法です。 Gradleとは Groovy製のビルドツールになります。Javaを始めAndroidやC/C++でも使えるようです。モジュールの依存関係の解決やちょっとした処理をG…

JEP378を読んで、テキスト変換の方法をおさらいする

エキサイト株式会社エンジニアの佐々木です。Java17が昨年リリースされ、JEP378のテキストブロックがLTSとして入ったので改めてJEP378を読むとテキスト変換の方法がいくつか書いてあったので、復習がてらおさらいします。 openjdk.java.net テキストブロック…

SpringBoot DevToolsのHot RestartとLiveReloadでサクサク開発を行う

エキサイト株式会社エンジニアの佐々木です。2021年エキサイトホールディングス アドベントカレンダー19日を担当させていただきます。 余談 エキサイトのメディア事業部では、SpringBootを使用して過去の技術的負債に立ち向かっております。私がジョインして…

SpringBootでEventListenerの実装

エキサイト株式会社エンジニアの佐々木です。2021年Exciteホールディングスアドベントカレンダー17日目を担当させていただきます。 SpringBootでのイベントリスナーの実装についてです。 はじめに SpringBootでは、アノテーションを用いたイベントリスナーの…

SpringBoot x Spring Shell で簡易バッチ処理を作る

エキサイト株式会社エンジニアの佐々木です。2021年エキサイトホーディングスアドベントカレンダー7日目を担当させていただきます。 以前、SpringBootで対話的インターフェースをSpring Shellで実装するで対話的なアプリケーションについては記載しており、…

JavaとLombokの@Withでイミュータブルなデータ型を生成する

エキサイト株式会社エンジニアの佐々木です。2021年アドベントカレンダー5日目を担当します。 サービスを開発している上で、データをなるべくイミュータブルにするというのは、バグを作り込まない上で重要だと思います。Java15でRecord型が導入されています…

SpringBoot x Gradleマルチプロジェクトで環境構築をする

エキサイト株式会社佐々木です。アドベントカレンダー2021の2ページ目の1日目になります。メディア事業部では、SpringBoot x Gradleマルチプロジェクトを使用して、モジュラーモノリスのような構成で各メディアのリビルドの開発を進めています。既存のリポジ…

SpringBootで対話的インターフェースをSpring Shellで実装する

エキサイト株式会社エンジニアの佐々木です。SpringBootは、Webアプリケーションフレームワークというのが一般的な認識可と思いますが、結構なんでもできたります。今回はマイナーな、インタラクティブなCUIアプリケーションを作る、SpringShellの機能につい…

SpringBootで画像を受け取りそのまま表示する方法

エキサイト株式会社エンジニアの佐々木です。小ネタですが、画像を受け取ってそのまま表示する方法のメモです。 はじめに SpringBootで画像を受け取って表示する簡単なサンプルです。フォームでファイルをアップロードし、それをそのまま表示するだけのデモ…

SpringBootでapplication.yaml以外の外部リソースファイルを読み込む

エキサイト株式会社エンジニアの佐々木です。アプリケーションを開発していると設定が増えてくると思いますが、増えてくるとファイルが増えて大変です。また、モジュラーモノリスのような構成にすると設定を別々に管理した方が都合がいいことがでてきます。S…

SpringBootで設定ファイル(application.yaml)を一括で読み込む

エキサイト株式会社エンジニアの佐々木です。SpringBootでの設定ファイル(application.yaml)を一括で読む方法のメモになります。 前提 SpringBoot2.4以上で検証しています。 起動クラスの設定 ソースコードは下記になります。 起動クラスに@ConfigurationPro…

SpringBootでスネークケースのリクエストパラメータを受け取る方法

エキサイト株式会社エンジニアの佐々木です。古いシステムをSpringBootリビルドしており、リクエストパラメータの命名が統一されていないというのがあったので、対応方法の一例を紹介します。 @RequestParamで解決する @RequestParamのname属性で指定できま…

Javaのカスタムバリデーションで2つ以上のプロパティをチェックするアノテーション

エキサイト株式会社 メディア開発の佐々木です。 現在、SpringBootで2つ以上のプロパティをチェックするカスタムバリデーションを共有します。 アノテーションの定義 下記のようにカスタムアノテーションを定義します。 (@Constraint(validatedBy = NotBlank…

SpringBoot AOP でメソッドの実行時間を計測する

エキサイト株式会社 メディア開発の佐々木です。 SpringBoot/AOPでメソッドの実行時間を計測します。計測は重要です。 依存関係の解消 Gradleで依存関係を解消します。 dependencies { ... implementation "org.springframework.boot:spring-boot-starter-ao…

Javaのenumの基本的な使い方

エキサイト株式会社メディア開発佐々木です。Javaの列挙型であるenumの基本的な使い方を共有します。 enumとは 列挙型と言われます。Javaの列挙型はJava1.5の頃から使え、当時の他の言語の列挙型より強力だったという話があります。そして、Javaの列挙型は単…

MyBatisのDynamicSQLにFreeMarkerを採用する

エキサイト株式会社メディア開発佐々木です。 SpringBoot/Javaで既存システムのリビルド開発を行っていますが、ORマッピー(正確にはORマッパーではない)にはMyBatisを採用しています。テーブル構成はなかなか変えられない為、良くも悪くも自由度の高いMyBati…

Java15のTextBlockとMyBatisのカスタムクエリについて

エキサイト株式会社メディア開発の佐々木です。 Java15で入ったTextBlockでMyBatisのカスタムクエリがアノテーション内でできないかなと思い試してみました。 結果 できた。これは嬉しい。Javaのことだからアノテーションだけ使えないとかはさすがにないと思…

JSR303の@ValidとSpringBootの@Validatedの違い

エキサイト株式会社メディア開発の佐々木です。 Javaには、JSR303 Bean Validationという私の好きなValidation仕様があります。@Validをつければ、クラスのフィールドに@Emptyや@Min(1)のようなアノテーションをつけるだけで、値のバリデーションが可能です…

GithubのPullRequestのコメントにラベルを書くようにして生産性を少し改善する

エキサイト株式会社メディア開発の佐々木です。 メディア開発では、github.comを使ってソースコード管理を行っています。人数やプロジェクトが多くなってくるとPullRequestのコメントの書き方がバラバラになってくるので、生産性を確保する為に下記のような…

SpringBootでのリクエストの日付処理

エキサイト株式会社 メディア開発の佐々木です。 SpringBootでは、日付処理をある程度アノテーションで処理できるので共有します。 @RestController @RequestMapping public class DemoController { @GetMapping("/date_format") public Form dateFormat(For…

Javaで戻り値を多値で返したい

エキサイト株式会社メディア開発の佐々木です。 Javaは、戻り値を1つしか返せない言語です。GoやPythonは複数返すことができますが、言語的にサポートされていないので、ライブラリを使って代用します。 設定 使うライブラリは、有名なcommons-lang3になりま…

JavaのOptional型の利用方針

エキサイト株式会社メディア開発の佐々木です。 メンバーもJavaの開発に慣れてきて、今まで触ってきた言語にはない機能だったり仕組みだったりに格闘している日々です。今日は、Optionalについてです。 Optionalとは Javaは、nullを許容しているレガシー言語…

Javaでメソッド参照を使うかラムダ式を使うかの判断

エキサイト株式会社 メディア開発佐々木です。 現在Spring/Javaで開発するにあたって、関数型インターフェースを呼ぶときにラムダ式でもメソッド参照でも書ける場合があります。どちらを使った方が、継続的な開発にいいのかを簡単にですがまとめてみます。 …

MapStructで高速なオブジェクトマッピングをする

エキサイト株式会社メディア開発の佐々木です。 以前、下記の記事でJavaのオブジェクトマッピングツールでModelMapperを紹介しました。 excitech.hatenablog.com ModelMapperは、とてもお手軽で大変便利なのですが、やや速度に問題があり大量のデータ処理等…

ModelMapperが便利

エキサイト株式会社 メディア開発 佐々木です。 SpringBootで開発をしているのですが、データの詰め替えとか割と頻繁にあり、データのマッピング処理が面倒になってきます。そこで、 ModelMapper というライブラリが便利です。(ただしパフォーマンス的には良…