Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

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でしばらく触っていこうと思います。

Spring BootのAutoConfigureには実はSendGridが含まれている!

この記事は「SendGrid Advent Calendar 2016」の5日目の記事です。
昨日は @ayakomuro さんの「First time using SendGrid」でした。
明日は公式ブログさんですw

Spring Bootの勢い

私は仕事で長らくJava EEを使ってきたのですが、もちろん、常にSpring Frameworkの存在は気になっていました。特にSpring Bootが出て以降、周囲で良い評判を耳にする機会がさらに増え、浮気心が沸いてます。そういった中、先月「Spring Day 2016」に参加したのですが、人の多さやイベントの盛り上がり方、多くの有名企業が発表するセッションなどを目の当たりにして「うぉー」ってなりました(^^;

そんなわけで、最近、改めてコツコツとSpring Bootを触り始めています。ちなみに私みたいなSpring Boot初心者は、最初に以下の本を読むのが良いです。色々と手を動かしながら学べます。薄いけど内容濃くて、持ち運び便利なのも好きな所です。

ちなみに自分はこちらも買ってコツコツ読んでいる所です(^^;

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
株式会社NTTデータ
翔泳社
売り上げランキング: 12,616

Spring Boot with NetBeans

自分はJava EEやってたこともあって、IDEはNetBeans派なのですが、以下のプラグイン

plugins.netbeans.org

を使うと

f:id:kikutaro777:20161204231555j:plain

f:id:kikutaro777:20161204231649j:plain

こんな感じでNetBeansからもSpring Initializrでプロジェクトの雛形作成することができて便利です。普段Java EEでNetBeans触ってる方は是非一度お試しを(^^;

SendGridのAutoConfigure

では本題へ。

Spring BootにはAutoConfigureというものがあってSpringが提供してる機能やその他ライブラリなどを簡単に使えるようになっているとのことです。AutoConfigureについては以下の情報がかなり詳しく、実際アノテーションを追っていきながら読んでみると非常に面白かったです。

qiita.com

上記解説の中にAutoConfigureの一覧がありますが、よくみると…

……

おぉ、今日のAdvent CalendarのテーマであるSendGridが!(わざとらしい

f:id:kikutaro777:20161205173837j:plain

GutHubだとここで確認できます。

f:id:kikutaro777:20161205180733j:plain

それにしても、眺めてみると有名なものがたくさん並んでいますね(^^;

f:id:kikutaro777:20161204224834j:plain

couchbase,flyway,mongoなどのDB関連や、freemarker,mustache,thymeleafなどのテンプレートエンジン、hazelcastやkafka,solrなどなど…これらと一緒に並んでいるのをみて、個人的には胸熱です。

Mandrill(MailChimp)などはないですしw

ということで、Spring Bootから簡単にSendGridを利用したメール送信をすることができます。@Beanなどが不要で、application.propertiesかapplication.ymlにAPI Keyを記述するだけで@AutoWiredにてDIされます。

application.properties

spring.sendgrid.apiKey = #SendGridで取得したAPI Keyを指定

または

application.yml

spring:
    sendgrid:
        apiKey : #SendGridで取得したAPI Keyを指定

依存性にSendGridから提供されているJavaライブラリを追加します。

<dependency>
    <groupId>com.sendgrid</groupId>
    <artifactId>sendgrid-java</artifactId>
    <version>3.1.0</version>
</dependency>

あとは、サンプルと合わせて以下のような感じに。今回はRest APIで「/send」を指定したらメールが飛ぶようなサンプルです。

package com.example;

import com.sendgrid.Content;
import com.sendgrid.Email;
import com.sendgrid.Mail;
import com.sendgrid.Method;
import com.sendgrid.Request;
import com.sendgrid.Response;
import com.sendgrid.SendGrid;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SendGridController {
    
    @Autowired
    private SendGrid sendGrid;
    
    @GetMapping("send")
    public Response send() {
        Email from = new Email("test@example.com");
        String subject = "Hello World from the SendGrid Java Library!";
        Email to = new Email("test@example.com");
        Content content = new Content("text/plain", "Hello, Email!");
        Mail mail = new Mail(from, subject, to, content);

        Request request = new Request();
        Response ret = null;
        try {
            request.method = Method.POST;
            request.endpoint = "mail/send";
            request.body = mail.build();
            ret = sendGrid.api(request);
        } catch (IOException ex) {
            //TODO:例外処理
        }
        return ret;
    }
}

mainはテンプレのまま。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootSendGridApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootSendGridApplication.class, args);
	}
}

SendGridのアカウントを取得して、API Keyを発行していることを前提に書きましたが、Keyの発行自体は非常に簡単です。

APIキーの管理 - ドキュメント | SendGrid
APIキー認証でセキュリティを強化しよう | SendGridブログ

Spring Bootを使ったサービス開発で「メールサーバ構築めんどくさいなぁ」とか「気軽にメール送れるサービスないかなぁ」と考えている方は是非一度お試し頂きたいなーと思います(^^)

サービスを動かす環境としてCloud Foundryも手軽です!

SendGrid x Spring BootをPivotal Web Services(Cloud Foundry)で試す - BLOG.IK.AM
Pivotal Web ServicesからのSendGrid利用 | SendGridブログ

Happy Sending!

NetBeansでやってみた「はじめてのSpring Boot」

JJUG CCCの懇親会で@makingさんと話したら、Spring Bootの書籍を頂きました(^^)
ありがとうございます!!

f:id:kikutaro777:20141120003221j:plain

火事であらゆる技術書が燃えたり水浸しになってしまい(金魚本すら…ウッ)、Javaの書籍としては「Javaエンジニア養成読本」の次が「はじめてのSpring Boot」となりました。

著者がうまいこと言ってました(私が「堀北真希さん」の大ファンだから(^^;;)

ということで、本を読みながら、普段使ってるNetBeansでSpring Bootやってみました。
NetBeans 8.0.1&JDK 1.8です。

「ファイル」->「新規プロジェクト」

f:id:kikutaro777:20141120004333j:plain

カテゴリ「Maven」でプロジェクト「Javaアプリケーション」を選択

f:id:kikutaro777:20141120004408j:plain

プロジェクト名など適当に入力

f:id:kikutaro777:20141120004552j:plain

pom.xmlを編集

NetBeansで生成されたpom.xmlは次の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>MyFirstSpringBoot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

で、以下のように定義を追加します。各定義の意味は「はじめてのSpring Boot」書籍に詳しく解説があります(^^)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>MyFirstSpringBoot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <!-- ここから追加 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.8.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>        
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <!-- ここまで追加 -->
</project>

次にメインクラスを定義していきます。

パッケージを右クリック「新規」->「その他」

f:id:kikutaro777:20141120005042j:plain

カテゴリ「Java」ファイル・タイプ「Javaメイン・クラス」選択

f:id:kikutaro777:20141120005223j:plain

クラス名「App」などへ

f:id:kikutaro777:20141120005242j:plain

コード書く

デフォルトで生成されたApp.javaは次の通りです。

package com.mycompany.myfirstspringboot;

/**
 *
 * @author kikuta
 */
public class App {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }
    
}

これを以下のようにします。各種アノテーションやコードの説明は「はじめてのSpring Boot」書籍に詳しく解説があります(^^)

package com.mycompany.myfirstspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * @author kikuta
 */
@RestController
@EnableAutoConfiguration
public class App {

    @RequestMapping("/")
    public String home(){
        return "Hello, World !";
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    
}

実行

こんな感じに実行すると
f:id:kikutaro777:20141120005745j:plain

Springの文字がみえて、待ち受け状態に
f:id:kikutaro777:20141120005756j:plain

ブラウザを立ち上げてlocalhostの8080にアクセスすると…あっさり成功!
f:id:kikutaro777:20141120005835j:plain

うーむ手軽だ。

(当たり前かもですが)NetBeansでも普通に進められそうなので読み進めていきます!

ということで、解説が気になる方は「はじめてのSpring Boot」買いましょう!
ページ数も170ページくらいで、とても読みやすいし、実践的な内容となってます↓



JJUG ナイトセミナー「Spring Framework 特集」に行ってきました #jjug

2014年初の勉強会はJJUG(日本Javaユーザーグループ)のナイトセミナーでした。
テーマは「Spring Framework 特集」
http://jjug.doorkeeper.jp/events/8113

Spring Frameworkは実際に触ったことないのですが、Java EEを選ぶまでには当然名前が挙がって、書店によっては金魚本より以下のSpring3入門がドーンと置いてあったりしますよね(^^;

Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ
長谷川 裕一 大野 渉 土岐 孝平
技術評論社
売り上げランキング: 55,079

今日の発表でもこの本の紹介してました。Springを始める方には、やはりオススメの一冊とのことです。

自分は立ち読みでパラパラみて「うわー、読みやすそうだなー」と思って買いかけましたが、Java EEですらまだまだな感じなので一旦戻しました。今日の話を聞いてやっぱ買おうかな…と思ったり。

再入門!RESTとSpringMVC

前半はてらひでさんによる「再入門!RESTとSpringMVC」でした。

プレゼンしていたノートPCが調子悪いようで、2回も突然フリーズしてしまい、最後は参加者の方のPCを借りつつ進められていました(^^;

フリーズだけはどうしようもないから災難だなぁ…と。Springの発表をOracleさんの会場でやったからなのでしょうか…怖い…。

WebとHTTPの基礎的なお話から、MVC2とSpring MVCの話、そしてライブコーディング的なデモ…(がフリーズ…)の流れでした。

「spring io」でググりましょう、とのことで、やってみると公式サイトが出てきました。

http://spring.io/

f:id:kikutaro777:20140121224804j:plain

アクセスすると

f:id:kikutaro777:20140121224858j:plain

上の「GUIDES」メニューを選んで、飛んだ先のページで「mvc」とかで検索するとSpring MVCのチュートリアルが見つかります。

Serving Web Content with Spring MVC

f:id:kikutaro777:20140121225023j:plain

ここからzip落として、gradleでeclipse用にビルドして、、、といった流れ。

Springのサイト、こういうチュートリアルが豊富でいいなぁ、と感じました。
Java EEも7になってから良い感じのチュートリアルになったと思いますが、Springみたいなほうが読みやすい感じも。好みかな(^^;
http://docs.oracle.com/javaee/7/tutorial/doc/

手元にEclipse入れたマシンないのですが、NetBeansでもできるらしいので、どこかで少しやってみようかなー。

Spring4とSpring Bootで作る次世代Springアプリケーション

後半は@makingさんによる発表でした。

TLが結構盛り上がってたように、Spring4というかSpring Bootすごいなーと。
※@yamadamnさんが早速トゥギャってました-> http://togetter.com/li/619231

jarで手軽に動いてしまったり("war" is over!と言われるらしいですw)

ssh化も簡単にできたり

設定ファイル(Protperty)が柔軟だったり

他にも色々便利そうな機能がっ。

1年前にこの発表を聞いていたらSpring重視でやっていたかも(^^;
ってちょっと思いました。

タイトルの「次世代」がぴったりな感じでした。

スライド数みると198枚もあるけど、コード例豊富だし、Spring Bootはドキュメントがまだまだでソースみながらやってたりするらしく、すごいなぁと(^^;

それにしてもJavaの世界、フレームワークが色々ありすぎて、悩ましい。

自分達が作ろうと思うものに合ったフレームワークを選べばいいのだろうけど、それがどれなのかフィット感を把握するだけで数か月かかってしまいそうな(^^;
改めて皆どうやってフレームワークを選択しているんだろう。。と思ったり。

今年も自分なりにコツコツと頑張っていかねば。。。

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