最近、はじめてDomaを触りました。前々からあちこちで「Doma、いいよ!Doma!」と聞いていて存在は知っていたのですが。
私は長らくJava EEをやってたので、IDEはNetBeansが馴染んでいて、他のフレームワークを触るときでも、ついNetBeansを使いたくなります。で、Domaを調べていると、EclipseとIntelliJ IDEAの情報がほとんどでNetBeans関連が見当たりませんでした。
Spring Bootと組み合わせて使いたいなと思って、調べたところ@makingさんが作ったdoma-spring-boot-starterが出てきて、ここのGitHubのページがIntelliJ IDEAを使った丁寧なチュートリアルになっていました。
github.com
で、このチュートリアルを参考にNetBeansで少し試してみたら、SQLファイルを配置したとき以下のようなコンパイルエラーがでました。
-------------------------------------------------------------
COMPILATION ERROR :
-------------------------------------------------------------
jp/co/kke/doma/dao/MagazineDao.java:[18,20]
[DOMA4019] ファイル[META-INF/jp/co/kke/doma/dao/MagazineDao/
selectAll.sql]がクラスパスから見つかりませんでした。
ファイルの絶対パスは
"C:\Users\kikuta\Documents\NetBeansProjects
\SpringBootDomaSample\target\classes\META-INF\jp\co\kke
\doma\dao\MagazineDao\selectAll.sql"です。
1 error
-------------------------------------------------------------
-------------------------------------------------------------
BUILD FAILURE
-------------------------------------------------------------
Domaではapt(Annotation Processing Tool)によってソースを自動生成してくれるようなのですが、sqlファイルをみつけられないようです。コードも以下のようにエラーとなっています。
そこで、maven-apt-pluginで以下を追加しました。
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>maven-apt-plugin</artifactId>
<version>1.0.4</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>src/main/resources/META-INF/jp/co/kke/doma/dao/MagazineDao</outputDirectory>
<processor>org.seasar.doma.boot.ConfigAutowireable</processor>
</configuration>
</execution>
</executions>
</plugin>
これでビルドが通って、Domaが動かせました。
Java EEやってる人はNetBeansに慣れている人が多いと思いますが、自分みたいに「最近SpringBootが気になるので、Spring Boot + Domaやってみたいなぁ、できればNetBeansで」と思ってる人がいれば、以下試した手順が参考になれば幸いです。
環境
自分の試した環境は
- Windows 10 Pro 64bit
- JDK 8u112 64bit
- NetBeans 8.2
です。
NB Spring Boot
Spring Bootにはプロジェクトのひな型を作ってくれるSpring Initializrがあります。Webで作ってもいいのですが、NetBeansから使えると楽です。そこで、NB Spring Bootというプラグインを利用します。
「ツール」の「プラグイン」メニューを選択します。
NB Spring Bootにチェックを入れてインストールします。
Spring Bootのプロジェクト作成
NB Spring Bootプラグインを入れた後、「ファイル」「新規プロジェクト」の「Maven」から「Spring Boot Initializr project」を選びます。
プロジェクト情報を入れます。
RESTを使ってDBの値を取得するため、Webにチェックを入れます(ここではLombokも選びました)。
DBはPostgres(Heroku上の)を使うのでチェックし、JDBCもチェックしました。
ちなみに今回サンプルで作ったDBは以下簡単なcreate文で作ったテーブルです。
create table magazine
(
id serial not null,
mail text
)
Domaの利用
プロジェクトができたら、pom.xmlのdependenciesに以下追加します。
<dependency>
<groupId>org.seasar.doma.boot</groupId>
<artifactId>doma-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
application.propertiesファイルにDB接続情報を入れます。
doma.dialect = postgres
spring.datasource.initialize=true
spring.datasource.url= jdbc:postgresql://hogehoge?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
spring.datasource.username=hogehoge
spring.datasource.password=hogehoge
spring.datasource.driverClassName=org.postgresql.Driver
コードは、Entityクラス、DAO、ServiceとControllerをそれぞれ追加しました。
Entityクラス「Magazine.java」
import org.seasar.doma.Entity;
import org.seasar.doma.GeneratedValue;
import org.seasar.doma.GenerationType;
import org.seasar.doma.Id;
@Entity
public class Magazine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
public String mail;
}
DAO
import jp.co.kke.doma.entity.Magazine;
import java.util.List;
import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;
@ConfigAutowireable
@Dao
public interface MagazineDao {
@Select
List<Magazine> selectAll();
}
DAOに合わせてDoma用のSQLファイル「selectAll.sql」を作成し
src/main/resources/META-INF/jp/co/kke/spring/dao/MagazineDao/
に配置しました。
sqlファイルの中は
SELECT id, mail FROM magazine
と単純に全取得するものです。
続けてServiceクラスを作ります。
import jp.co.kke.doma.entity.Magazine;
import java.util.List;
import jp.co.kke.doma.dao.MagazineDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MagazineService {
@Autowired
private MagazineDao magazineDao;
public List<Magazine> getMagazines() {
return magazineDao.selectAll();
}
}
最後にRest用のコントローラを追加します。
import java.util.List;
import jp.co.kke.doma.entity.Magazine;
import jp.co.kke.doma.service.MagazineService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MagazineController {
@Autowired
private MagazineService magazineService;
@GetMapping("/magazines")
public List<Magazine> getMagazines() {
return magazineService.getMagazines();
}
}
NetBeansのキャプチャはこんな感じです。
MagazineDaoは残念ながら赤いエラーが出てしまうのですが、実際にはコンパイルできます。
で、実行して「http://localhost:8080/magazines」へアクセスすると
とDBの中身が表示されました!
ということで、NetBeansでしばらく触っていこうと思います。