RestControllerAdviceについて

エキサイト株式会社の中尾です。 SpringBootでexceptionが発生したとき、特定のエラーレスポンスで返す方法を記載します。 以下、コードになります。 @RestControllerAdvice @Slf4j public class ExceptionController { @ExceptionHandler({BadRequestExcept…

sql serverのflywayの設定について

ご無沙汰しています。株式会社エキサイトの中尾です。 sql serverの本番のデータベースの定義をローカル環境のdockerに再現する際に罠にかかったのでその内容を記載します。 なお、復旧にはflywayを使用します。 やりたいことは以下です。 ローカル環境にsql…

gradleからgradle実行

こんばんは。エキサイト株式会社中尾です。 gradleからjibを実行する時引数でいろいろ指定すると思いますが、めんどくさいですよね? ※例ではspring.profiles.activeしか指定していません。 ./gradlew jib -Djib.container.args=--spring.profiles.active=de…

ModelMapperのcustom mappingについて

エキサイト株式会社 メディアサービスエンジニアの中尾です。 前回に続いてModelMapperのちょっとした内容を説明します。 現場ではほとんど使うことはないと思うので、「こんなこともできるんだ」ぐらいでお願いします。 コードは以下になります。 @ExtendWi…

effective java の 防御的コピーの話を自分なりに実装してみた

エキサイト株式会社の中尾です。 effective java を最近読んでいて、気になった部分を自分でコーディングして理解を深めようと思っています。 その一部を紹介します。 public class Main { public static void main(String[] args) { System.out.println("元…

modelmapperの曖昧なマッピングを厳密なマッピングに

エキサイト株式会社の中尾です。 今回はModelMapperのよく使われるオプションについて、説明します。 以下の例は、userIdを別のモデルにマッピングします。 userIdからuserIdなのでもちろんテストは通ります。 @ExtendWith(MockitoExtension.class) public c…

RedisCacheConfigの設定

エキサイト株式会社 メディア事業部エンジニアの中尾です。 SQL Serverからデータを取得し、redisにデータをキャッシュさせようとしたら以下のエラーが出ました。 Could not write JSON: Java 8 date/time type `java.time.LocalDateTime` not supported by …

restTemplateでElasticsearchに問い合わせる

エキサイト株式会社 メディア事業部エンジニアの中尾です。 rest-high-level-clientのようなライブラリではなく、restTmeplateでElasticsearchに問い合わせる方法を説明します。 https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch…

SQL Serverのwith(NOLOCK)の挙動について

エキサイト株式会社 メディア事業部エンジニアの中尾です。 最近はSQL Serverを使うことが多いので、SQL Serverでよく使われているwith(NOLOCK)の挙動について説明できたらと思います。 with(NOLOCK)とは 簡単にいうと、トランザクションレベルを強制的にREA…

UTってどこまでやればいいんだろう?(ポエム)

エキサイト株式会社 メディア事業部エンジニアの中です。 SpringBootでUTをやる方法をいくつか紹介しましたが、、、実際にはどこまでやればいいんだろうと、ちょっとポエムを記載します。 tech.excite.co.jp tech.excite.co.jp tech.excite.co.jp tech.excit…

SpringBootでRestTemplateを使った外部APIを実行している実装をテストする。

エキサイト株式会社 メディア事業部エンジニアの中です。 SpringBootでRestTemplateを使った外部APIを実行している実装をテストする方法を記載します。 やり方は単純で、mockitoを使います。 ユースケース RestTemplateを使った外部APIを実行している実装を…

json diffを効率よく、ワンライナーで

エキサイト株式会社 メディア事業部エンジニアの中です。 今回はjson diffを簡単にできる方法を記載しようと思います。 例えば、以下のようなjsonが2種類あったとします。 { "userId": 1, "id": 1, "title": "naka", "body": "sho" } { "body": "sho" "title…

SpringBoot でSQLをテストする(Mybatis)

エキサイト株式会社 メディア事業部エンジニアの中です。 SpringBootでmybatisで発行したSQLのテストのやり方を記載します。 H2というin-memoryデータベースを用意し、schema.sql、data.sqlの初期データを挿入してから、SQLを発行し、正しくデータが取得でき…

MockHttpServletRequestでControllerのテストする(2)

エキサイト株式会社の中です。 Java Spring BootでControllerのJSONの送信と受信のテストをする方法を説明します。 ユースケース Controllerのテストをする。 2.受け口をPostにする。 3.Jsonパラメータを送信する 4.Jsonパラメータを受信する 題材 コード例 …

カスタムバリデーション時のnullについて

エキサイト株式会社 メディア事業部エンジニアの中です。 カスタムバリデーションと@NotEmptyをつけてユニットテストする際、nullを設定すると NullPointerExceptionが発生することがあります。 理由は@NotEmptyと@CustomValidateの2回チェックが通るため、 …

ReflectionTestUtilsで変数に値をセットする

エキサイト株式会社の中です。 Spring Bootでpropertyの値を取得する時、@Valueで取得すると思います。 @Valueは外部から値を注入しているので、UTをする時mockを設定しなければなりません。 ReflectionTestUtilsを使って設定する方法を説明します。 @Servic…

MockHttpServletRequestでcontrollerのテストする(1)

エキサイト株式会社の中です。 Java Spring Bootでcontrollerのテストをする方法を説明します。 ユースケース controllerのテストをする。 Cookieを設定する 題材 コード例 @GetMapping("cookie") public String showCookies( @CookieValue(name = "naka", r…

@CookieValueでクッキーの値を取得するとき、URLエンコードされる問題の解消

エキサイト株式会社の中です。 Spring BootでCookieの値を取得する時、Controllerで @CookieValue(name = "hoge", required = false) String hoge で取得できると思います。 しかし、Stringで受け取る際、勝手にURLデコードされて困る場合があります。 そこ…

SQL Serverのdockerコンテナにバックアップ復元する方法(2020)

エキサイト株式会社の中です。 SQL Serverをローカル環境に用意するのにハマったことを記載します。 ユースケース SQL Serverを使ったローカル開発をしたい。 test環境のデータを、ローカル環境に復元したい。 題材 docs.microsoft.com 1のみの場合、手順通…

Javaで一括文字列変換

エキサイト株式会社の中です。 最近Javaで大量の文字列を一括置換する処理作ったので紹介します。 性能部分にちょっと不安がありますが。。。 wikipediaでも自動で特定のワードに対してリンクになりますが、イメージはあんな感じです。 ユースケース 特定の…

mybatisで複数のデータソースを設定する方法について

初めまして エキサイト株式会社の中です。 最近Javaを書くことが多いので、学んだことを記載していこうと思います。 よろしくお願いいたします。 MyBatisでデータソースを切り変える 弊社では、データベースとJavaを繋ぐlibraryにMyBatisを使用しています。 …