ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Dropwizard + JDBI で SQL オブジェクトの返り値に Optional を使うときには SingleValueResult アノテーションが必要

DropwizardSQL ライブラリ JDBI を使うときのおはなし。

OptionalContainerFactory

dropwizard-jdbi ライブラリは OptionalContainerFactory クラスを提供してくれていて、JDBI の SQL オブジェクトで返り値に Java 8 で導入された Optional 指定することができます。

ちなみに普通に dropwizard-jdbi の DBIFactory#build メソッドを使うと自動的に OptionalContainerFactoryDBI に登録してくれるので、自分で登録する必要はありません。 (Dropwizard 1.0.5 で確認。)

SingleValueResult アノテーションが必要 (単に Optional を指定するだけでは動かない)

SQL オブジェクトのクラス定義で返り値に Optional を指定すればそれだけで動くのかと思いきや、実はそんなことはありません。 Optional を返すメソッドに SingleValueResult アノテーションを付ける必要があります。

import info.vividcode.app.web.example.dropwizard.domain.Person;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.customizers.SingleValueResult;

import java.util.Optional;

public interface PersonDao {

    @SqlQuery("SELECT * FROM person LIMIT 1")
    @SingleValueResult(Person.class)
    Optional<Person> findOne();

}

ここら辺のドキュメントがないので、ソースコードを読んで確認しました。

Optional を使う場合に限らず、Iterable じゃなくてコンテナを使いたい場合は SingleValueResult アノテーションを付ける必要がありそうですね。

関連ページ