Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

NetBeansでSpring Boot + Doma

最近、はじめて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ファイルをみつけられないようです。コードも以下のようにエラーとなっています。

f:id:kikutaro777:20161228000545p:plain

そこで、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というプラグインを利用します。

「ツール」の「プラグイン」メニューを選択します。
f:id:kikutaro777:20161228001639p:plain

NB Spring Bootにチェックを入れてインストールします。
f:id:kikutaro777:20161228001955p:plain

f:id:kikutaro777:20161228002038p:plain

f:id:kikutaro777:20161228002126p:plain

Spring Bootのプロジェクト作成

NB Spring Bootプラグインを入れた後、「ファイル」「新規プロジェクト」の「Maven」から「Spring Boot Initializr project」を選びます。
f:id:kikutaro777:20161228004421p:plain

プロジェクト情報を入れます。
f:id:kikutaro777:20161228004432p:plain

RESTを使ってDBの値を取得するため、Webにチェックを入れます(ここではLombokも選びました)。
f:id:kikutaro777:20161228004542p:plain

DBはPostgres(Heroku上の)を使うのでチェックし、JDBCもチェックしました。
f:id:kikutaro777:20161228004551p:plain

f:id:kikutaro777:20161228004558p:plain

ちなみに今回サンプルで作った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のキャプチャはこんな感じです。

f:id:kikutaro777:20161228005912p:plain

MagazineDaoは残念ながら赤いエラーが出てしまうのですが、実際にはコンパイルできます。

で、実行して「http://localhost:8080/magazines」へアクセスすると

f:id:kikutaro777:20161228011506p:plain

とDBの中身が表示されました!

ということで、NetBeansでしばらく触っていこうと思います。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村