Controllerでもinterfaceをimplementsすることができる

こんばんは。エキサイト株式会社の中尾です。 あまり需要がないかもしれないですが、Controllerでもinterfaceをimplementsすることができます。 ただ普通にimplementsすることは、どんなクラスでもできますが、@RequestMappingや@GetMapping()や@RequestPara…

quarkusを使う(ログ出力編)

夜遅くからこんばんは。エキサイト株式会社中尾です。 quarkusの開発に慣れてきたのですが、いまいちdebug周りが見えなかったので、debugログを全部出すことにしました。 https://quarkus.io/guides/logging 詳しい設定はこちらに記載しているのですが、簡単…

quarkusを使う(テンプレートエンジン編)

こんばんは、エキサイト株式会社中尾です。 今回はテンプレートエンジンについて説明します。 quarkusにはQUTEがあります。 ja.quarkus.io 特徴として ネイティブビルドに対応(間違っているかもしれない) テンプレートファイルを変えたら、リロードすれば反…

quarkusを使う(ExceptionMapper編)

こんばんは お久しぶりです。エキサイト株式会社 中尾です。 最近は趣味でQuarkusを使っています。 本記事ではQuarkusの例外処理について紹介します。 Red Hatの皆様、コメントください、DM待っています。 今回はエラーのハンドリングということで、exceptio…

quarkusを使う(コンパイル編)

こんばんは、エキサイト株式会社の中尾です。 quarkusといえば、native compileでしょう。 まずはjvmで。 shogo.nakao@localhost:(main*) $ docker build -f src/main/docker/Dockerfile.jvm -t quarkus/hobby-jvm . [+] Building 100.3s (11/11) FINISHED =…

TABLE定義を設計する時、カラム名に半角数値を入れるのはやめよう

こんにちは、エキサイト株式会社の中尾です。 出落ちみたいなタイトルなのですが、みなさんはテーブル設計の時、カラム名はどのようにしていますか? 基本は - 半角英字のみ - 極力正式名称をカラム名に、妙な省略はしない - package、classなど特定の言語の…

quarkusを使う(mybatis編)

こんばんは、エキサイト株式会社の中尾です。 前回の続きです。 mybatisを入れていきます。 mybatisにはserviceと同様@Singletonをつけて、@Injectで呼び出します。 その際、repositoryを間に挟みます。 まず、必要なextentionをgradleに追加します。 implem…

quarkusを使う(inject編)

こんばんは、エキサイト株式会社の中尾です。 前回の続きです。 serviceを入れていきます。 serviceには@Singletonをつけて、@Injectで呼び出します。 ※サンプルです。 interface package org.my.hobby.service; import org.my.hobby.core.Book; public inte…

quarkusを使う(バリデーション編)

こんばんは、エキサイト株式会社の中尾です。 前回の続きです。 必要そうなツールを入れていきます。 まず、バリデーションを追加します。 gradleに以下を追加 implementation 'io.quarkus:quarkus-hibernate-validator' アノテーション でバリデーション設…

quarkusを使う(環境構築編)

初めまして、Red Hat大好きエキサイト株式会社の中尾です。 趣味でquarkusを使っていこうと思うので、その記録を残そうと思います。 quarkus cliは使いません。 まずは環境作りです。 quarkusでbuildツールgradleを使おうと思います。 mvnよりもgradleのほう…

DefaultErrorAttributesについて

エキサイト株式会社の中尾です。 RestControllerAdviceで拾えない例外処理を拾う方法を記載します。 よくある方法は、ExceptionHandlerで全てcatchする方法だと思います。 @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public Stri…

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のみの場合、手順通…