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

NetBeans 8.2のSQL Profiler機能

ふとTwitter眺めていたら以下情報が流れてきました。

NetBeans SQL Profilerとな!

せっかくなので、私もnightly buildを落として実際に触ってみました。
ちなみに次のNetBeans、Docker対応なんかもあるっぽいです。以下アイコンがありました。NetBeans 8.2で入る予定の機能とかは最後簡単に触れます。

f:id:kikutaro777:20160504172816j:plain

NetBeans IDE Build 201605020002インストール

Nightly Build版は以下から取得しました。

Index of /dev/nightly/

最初「NetBeans IDE Build 201605030002」を落としたのですが、手元のWindows 8.1だと以下エラーに(^^;

f:id:kikutaro777:20160504171618j:plain

何回かDLしたけど同じだったため、1つ古い「NetBeans IDE Build 201605020002」をインストールしました。

SQL Profiler

デフォで入ってるJava DBのサンプルDBと、NetBeansのコード自動生成で簡単なDB CRUDのJava EEを作成して試しました。

SQL Profilerの設定

スクショ取るのが手間だったので…以下gifアニメにて。使い方はNetBeansが持ってる通常のプロファイラ機能とほとんど一緒です。SQL Profilerを選ぶだけ。

f:id:kikutaro777:20160504165318g:plain

DBデータの一覧表示

Webアプリ側でDBの一覧表示をすると、実行されたSQLがガガガーっと表示されました。ほー。

f:id:kikutaro777:20160504170115g:plain

SQL実行の実行時間や呼出し回数などが表示されています。

f:id:kikutaro777:20160504172259j:plain

DBデータの更新

以下のキャプチャはinsertだけですが、当然deleteなども同じように表示されました。

f:id:kikutaro777:20160504165614g:plain

実行されたクエリも「View SQL Query」を選ぶと

f:id:kikutaro777:20160504172545j:plain

以下、確認できます。

f:id:kikutaro777:20160504172552j:plain

NetBeansロードマップ

NetBeansのロードマップは以下ページで確認できます。

netbeans.org

次の8.2は今年2016年の8月リリースを目指して動いてるようです。JDK9への対応具合などは多分Java Day Tokyo 2016JJUG CCC 2016 Springなどで何らか少しは出てくるのではないかと。

8.2では以下の機能が挙げられています。

JShellやES6対応辺りは注目度高そう。また、冒頭キャプチャだけ載せたDockerも入ってます。
そして、Oracle JET…お、おう。

  • ECMAScript 6 support
  • NodeJS enhancements and updates
  • Oracle JET support enhancements
  • PHP7 support
  • JavaShell support (JDK REPL)
  • Docker Support
  • Editor Multicarets
  • Pinnable Watches
  • SQL profiling
  • CND updates
  • more bug fixing

Editor MulticaretsとかPinnable Watchesは何だろう…(^^;全然わからないのでどこかで調べてみたい。

Salesforce Driver by JavaFX

この記事は、JavaFX Advent Calendar 201524 日目の記事です。

昨日は id:kozake (@s_kozake) さんの 「続・AndroidでJavaFXを動かしてみたよ!」 でした。
明日は id:skrb (@skrb) さんがトリを飾られます(^^)!!


今年1年を振り返ってみると、技術的に新しいものを探したり・触ったりする余裕がない1年でした。逆に言えば真面目に仕事をしていたというか(^^;

そんなわけで、残念ながらJavaFXに関してもあまり新しいネタはありません。(すみません…

ということで、今日は実際の仕事でJavaFXをこんな風に使ってみた、というネタにしたいと思います。

現場 x JavaFX

ちょうど昨日のJavaFX Adventでこざけさんが「JavaFXは僕の好きな技術ですが、イマイチ現場で使われている感がありません。」と書かれていました(^^;

皆さんの現場ではどうでしょう(^^;?

ちなみに自分の所(部門)では、デスクトップアプリを作る際はWindows FormやWPFといった.NET技術を使っています(C#)

JavaFXは存在は知っているものの(多分…)、最終的には使い慣れた技術のほうが実案件で選ばれるのは仕方がない…という所でしょうか(^^;

元々Windows系が多いので、あえてJavaFXを選択するラインがないです。

また、会社全体でみると、同様に.NET系が多いようですが、Javaの場合だと、やっぱりSwingが主力みたいなところは普通にあるようです。

仮配属にきた新人さんへJavaFXを少し触ってもらったのですが、本配属先ではSwingでした、というのが今年はありました。

テストドライバ x JavaFX

実案件は難しいけど、脇で使ったり、直接お客さんが触るものでない所でJavaFXを…と思って1年くらい経つのですが、少し前にちょうどいい感じの仕事が出てきました。

その仕事は、Salesforceと連携して使う、とあるWebシステム構築案件です。

Salesforceをご存じの方はわかると思いますが、Salesforceは非常にカスタマイズ性が高く、Apexという言語で画面作ったり、ボタンで複雑な処理を呼び出したり、色々なことができます。

うちは導入ベンダなどではないので、Salesforce部分は専門ベンダさんが構築で、うちが作るWebと連携する形です。

f:id:kikutaro777:20151224185907p:plain

当初連携ではSalesforceのRESTを使おうとしてましたが、最終的にはSOAPを使っています(詳細は以下エントリ)

kikutaro777.hatenablog.com

実際やってみるとSOAP使った連携は楽だよなぁと。SFDCのWSDLからクラス自動生成できますし。

さて、本題です。

今回のシステムでは、Salesforce側でうちのWeb画面を呼び出す前に色々とオブジェクトを操作する流れがあります。その後、うちのシステム側に情報が来て、加工して、SOAP APIで更新する、みたいな。更新するには先にSaleforceのロジックでオブジェクトが作成されていないといけない、などですね。

連携とかの開発ではよくある話だと思いますが、両社の開発過程では、まだ色々出揃ってないのでドライバやスタブなどが必要となります。

ドライバやスタブがわからない場合は情報処理試験の本以下ページにある図などがイメージしやすいかと。

What is the difference between stubs and drivers in software testing? - Quora

実際Salesforce上のApexなどでドライバが作れれば最高なわけですが、今回は期間的にもドライバを相手方に作ってもらう時間や、うちがApexを習得して自前でドライバを作る余裕はありませんでした。

なので、Javaで普通にSOAP APIを叩いて、Salesforce上で何かの操作をした後のオブジェクト構造とかを作り出すドライバを作りました。

f:id:kikutaro777:20151224190748p:plain

せっかくなので、JavaFXで作って、ドライバで作ったデータをすぐ確認できるように、WebViewもつけてます。以下のような感じ。

f:id:kikutaro777:20151224191326j:plain

ドライバでテストデータを作って、ブラウザ使わずともWebViewでみれたり。

f:id:kikutaro777:20151224191340j:plain

現場への導入第一歩としては良い感じではないかなーと(^^;

JavaFX使うと何がどこまでできるのか、とかも徐々にナレッジが溜まりそうですし。

書いてるコード

このプロジェクトで作ってるドライバは、非常に簡単なコードの集まりです(^^;

以下に、明日トリを飾る@skrbさんが以前JJUGでハンズオンをされたときの資料がありますが、これを1回やれば普通にできるレベルです。

上記ハンズオン資料は非常に細かく手順も書かれているので、新人さんでも普通にこなせます。
実際、プログラミング経験がほとんどない新人さんにやってもらったりもしてるので。

NetBeansでunpackingが遅い

ドライバ作ってるときにちょっと出会ったネタを最後に1つだけ。

自分はNetBeansでMavenを利用してJavaFXアプリを作っています。画面はSceneBuilderで。

で、今回のドライバはSalesforceのライブラリを使ったり、その他、諸々と依存性があったのですが

ビルドが超遅い(^^;

コンソールみると

f:id:kikutaro777:20151224192542j:plain

unpackingをすごいしています。調べると、java -jarで実行可能なjarファイルを作ってくれてて、そのために依存ライブラリをいれてるっぽい。

で、以下に同じ話がありました。

stackoverflow.com

上記StackOverflowにあった解決案としてprofileを作成するというのがあって、自分はそうしました。

NetBeans(ちなみに8.0.2) & Mavenで自動作成されたpom.xmlには

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>unpack-dependencies</id>

            <phase>package</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>${java.home}/../bin/javafxpackager</executable>
                <arguments>
                    <argument>-createjar</argument>
                    <argument>-nocss2bin</argument>
                    <argument>-appclass</argument>
                    <argument>${mainClass}</argument>
                    <argument>-srcdir</argument>
                    <argument>${project.build.directory}/classes</argument>
                    <argument>-outdir</argument>
                    <argument>${project.build.directory}</argument>
                    <argument>-outfile</argument>
                    <argument>${project.build.finalName}.jar</argument>
                </arguments>
            </configuration>
        </execution>
        <execution>
            <id>default-cli</id>
            <goals>
                <goal>exec</goal>                            
            </goals>
            <configuration>
                <executable>${java.home}/bin/java</executable>
                <commandlineArgs>${runfx.args}</commandlineArgs>
            </configuration>
        </execution>
    </executions>  
</plugin>

のような定義があるので、これを

<profiles>
    <profile>
        <id>executable</id>
        <build>
            <plugins>
                <plugin>
                    <!-- <groupId>以降をここへ移動 -->
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

これで、通常ビルドではunpackingせずに、実行可能なjarを作成したいときは以下プロファイルを指定してビルドすればいいような形になりました。

f:id:kikutaro777:20151224193022j:plain

明日は@skrbさんがトリを飾られます(^^)!!!

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ページくらいで、とても読みやすいし、実践的な内容となってます↓



jta-data-source名に__pmが付けられてエラーとなる

これ、ハマってる方がいるのかわからないのですが、自分は結構ハマったのでメモ。

手元の環境は

Windows 8 Pro(64bit)
JDK 7u67
NetBeans 8.0.1
GlassFish 4.1

で、Java DB(Derby)のテーブルからNetBeansの自動生成機能でエンティティ・クラス作ったりしたアプリをデプロイしたとき

重大: Exception while preparing the app : Invalid resource : MemoJNDI__pm
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : MemoJNDI__pm
at org.glassfish.jdbcruntime.service.JdbcDataSource.validateResource(JdbcDataSource.java:81)
at org.glassfish.jdbcruntime.service.JdbcDataSource.setResourceInfo(JdbcDataSource.java:62)
at org.glassfish.jdbcruntime.JdbcRuntimeExtension.lookupDataSourceInDAS(JdbcRuntimeExtension.java:136)
…略

みたいなエラーでこけてしまう。うーん、今まであまりなったことなかったのに…と。

自動生成されたpersistence.xmlのjta-data-sourceは

<persistence-unit name="sample.javaee_MemoApp_war_1.0PU" transaction-type="JTA">
    <jta-data-source>MemoJNDI</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
</persistence-unit>

となっていて「__pm」なんてつけてないんだけど…??みたいな。

ググると海外情報では同じエラーの人が多々いて、回答みてやってみたりもしたけど、ダメでした。


java - Glassfish can not find JNDI DataSource while deploying - Stack Overflow


java - JNDI resource name appended with _pm . Deployment fails . - Stack Overflow


java - Glassfish Server Error when deploy .war: Error occurred during deployment: Exception while preparing the app : Invalid resource - Stack Overflow

http://www.nagazuka.nl/2014/03/invalid-resource-with-netbeans-8_27.html

というか、GlassFish3.1.2.2とかNetBeans7.3でもなってるっぽい。自分はなったことないのだが。。。

で、ドメインを作り直すと、普通に動くようになりました。
前に@megascusさんが以下ブログでパスワードの所で注意、とあって、一番下にドメイン作り直し、というをやってみた感じ。


#JJUG_CCC Java EE 7 HoL補足 - 水まんじゅう

NetBeansのサーバ追加で新しくGlassFish4.1を食わせなおしただけですが。

f:id:kikutaro777:20140915165534j:plain

デフォルトで作られるドメインが駄目なのかなぁ。domain.xmlとか細かく見比べてみないと。

NetBeansで自動生成されるglassfish-resources.xmlでJDBCのconnection-poolやresourceを定義するのではなく、GlassFishの管理コンソールで手動作成すればいけるとも書いてありましたが、まだ試してないです。

GlassFish 4.1とNetBeans 8.0.1が出た!

タイトルの通り、GlassFish4.1がリリースされました!

はやくも@Denさんがブログ書かれてた(^^;

GlassFish4.1リリース! - DENの思うこと

GlassFishの4系はバージョン体系が4.0.1だったのですが、正式版になって4.1と変わっています。

この体系に関してはGlassFish Users Group Japanの副会長である蓮沼さんが以前にブログで書かれてるので以下参照下さい。


GlassFish 4.0.1 改め GlassFish 4.1 - GlassFish Japan

また、GlassFish4.1に合わせた形でNetBeans8.0.1がリリースされています。
もちろんGlassFish4.1がバンドルされています。

NetBeans 8.0.1での主な変更点は以下サイトにありますが、RequireJSとかKarmaとかNode.JS Bower Gruntなどが並んでる辺り、JavaScript系の強化なんでしょうかね。


NetBeans IDE 8.0.1 Release Information

あとは最新のPrimeFacesがバンドルされたことと

標準でWildFlyがサポートされた!!(前まではプラグイン入れないとダメでした)

f:id:kikutaro777:20140910202506j:plain

うーむ、このままWildFlyも勢いが出てきそうな。

最後に、個人的には以下はそろそろ消してもいいような…ボソリ

f:id:kikutaro777:20140910202654j:plain

#JJUG ナイトセミナ 「Eclipse、NetBeans、IntelliJ IDEA 3大IDE頂上決戦」楽しかった(^^)!

昨年の5月に行われた「Java Day Tokyo 2013」というイベントで「Java IDE の最新トレンド」というセッションがあって、私は他のセッションに参加してて聞けなかったのですが、TLがめっちゃ盛り上がってるのを見てました(^^;

そのときのイベント内容は以下のまとめレポートあたりが面白いかと。

で、今日はその第二次決戦な位置づけの#idewarsがJJUGナイトセミナで行われました。

JJUG ナイトセミナ 「2.19 Eclipse、NetBeans、IntelliJ IDEA 3大IDE頂上決戦 」
http://www.java-users.jp/?p=905

NetBeans
日本オラクル株式会社 片貝 正紀さん

IntelliJ IDEA
株式会社サムライズム 山本 裕介さん(@yusuke)

Eclipse
DBFlute 久保 雅彦さん (@jflute)

メインはIDEの機能紹介ですが、お三方ともライブコーディングを含む熱いデモが続いてすごい楽しかったです(^^)

自分の拙い文章で書いても色々伝わらないので(汗)、以下@yamadamnさんがまとめて下さっているtogetterをみてもらうほうがいいかと!

私はJava EEからJavaの世界に入って、最初からNetBeansをメインに利用してきたのですが、今日のデモで感じたことを一言にすると

NetBeans → 手軽にJava(もちろんJava EEも)始めるならやっぱりこれでは!
IntelliJ IDEA → 熱い機能ありすぎっ。欲しいっ。上司にねだってみる!
Eclipse → ショートカット極めるとこんなに凄まじいとは…

みたいな感じ(^^;

IntelliJは今日のデモを見ただけでも色々凄さが理解できたけど、多分今日のはほんの一部で、もっともっと色々あるんだろうなぁ……と思うと触ってみたくなる。Java EEは有償じゃないとお試しできないのがホント残念。本気で上司にねだってみようかと今日のデモみて思いました(^^;買うならやっぱりサムライズムさん経由ですかね~。

最後に@jfluteさんから「まず目の前のIDEを使いこなそう」との言葉がありましたが、ホントそうだよなぁ…と、しみじみ心に。
自分が普段利用してるNetBeansも何だかまだまだ使いこなしてない気がして…(-_-;

でも良い刺激になりました(^^;

ということで楽しかった!

NetBeans 8 Betaで標準装備されたPrimeFaces CRUD generator

以下のツイートみてNetBeans 8 Betaの存在に気づきました(^^;

NetBeans 8 Betaの機能紹介は英語ですが以下ページにあります。

NetBeans IDE 8.0 Beta Information

で、個人的に一番目についたのは

New PrimeFaces code generators, to generate complete PrimeFaces skeleton CRUD applications with connection to databases.

の部分でした(^^;

結構前ですが、本ブログで「NetBeans7.2.1とPrimeFacesであっという間にCRUD画面を作成する方法」なるものを書いて「PrimeFaces CRUD Generator for NetBeans Beta」を紹介したのですが、これに近いものがNetBeansに標準機能としてバンドルされたっぽい!?マジですか。

NetBeansにJSFのサードパーティであるPrimeFacesの自動生成機能をバンドルさせてしまうなんて…この海外と日本のJSFやPrimeFacesに関する温度差は一体…(^^;

というわけで、早速試してみました(^^)

試した環境は

OS :Windows 8 Professional
IDE :NetBeans 8.0 Beta
Java: JDK7
AP :GlassFish 4.0→3.1.2.2

当初Java EE7で試していたのですが、エラーになってしまい、多分解決できると思うのですが、いったんJava EE6で試しました(^^;すみません…。

まず最初にどんなWebアプリケーションが自動生成されるか、画面を紹介します。

自動生成される画面と機能

コードを自分では1行も書いていない…のですが、以下のような業務系マスタメンテ画面が自動生成されます。

トップページはメニューになっていて、一番上は日本語で生成されます(ここが何で日本語になるのか?内部的な仕組みはよくわかってないです)。

f:id:kikutaro777:20140129012852j:plain

この「PrimeFacesようこそページ」リンクをクリックするとPrimeFacesのデモ的な画面が表示されます。

f:id:kikutaro777:20140129013119j:plain

PrimeFaces使うとこんなレイアウトが簡単に作れるよ、的な感じですね。リンクはPrimeFacesのサイトへ貼られています。

で、「PrimeFacesようこそページ」以下のメニューリンクがCRUDに関するものです。

f:id:kikutaro777:20140129015023j:plain

それぞれテーブル単位にCRUD操作できる画面へのリンクとなっています。

「Show All Customer Items」のリンクをクリックすると以下の一覧画面が表示されます。

f:id:kikutaro777:20140129013356j:plain

画面の上にはメニューがあって、各種メンテナンス画面へリンクされています。

f:id:kikutaro777:20140129013451j:plain

一覧の下には

「CREATE」「VIEW」「EDIT」「DELETE」

と4つのボタンがあって、CRUD操作が可能です。

CREATE

CREATEボタンを押すと新規にデータ入力する画面がポップアップで表示され、保存できます。

f:id:kikutaro777:20140129013630j:plain

VIEW

VIEWボタンは以下画面

f:id:kikutaro777:20140129013658j:plain

EDIT

EDITボタンは以下画面で編集して保存できます。

f:id:kikutaro777:20140129013719j:plain

DELETE

最後はDELETEボタンで、選択行を削除します。成功するとメッセージも。
ただ、残念ながら削除確認ダイアログはでません(^^;

f:id:kikutaro777:20140129013805j:plain

基本的には他のページも同じ構成です。テーブル(マスタ)の属性が少ないものだと

f:id:kikutaro777:20140129013857j:plain

こんな感じ。簡易マスタメンテ画面ですね(^^;

PrimeFaces CRUD generator

というわけで、このNetBeansにバンドルされた「PrimeFaces CRUD generator」の機能は何者か?というと…

データベースのテーブルさえあればレコードを一覧表示してCRUDする画面や処理を自動生成する機能

というものになります。自動生成されたコードのままに実プロジェクトで使う、ということは難しいと思いますが、自分達のちょっとしたメンテ画面作ったり、営業のデモンストレーションやプロトタイプづくりには使えるんじゃないかなーと。

以降は実際に試した作成手順です。

MavenでJava EE6プロジェクト作成

NetBeans 8 Betaをインストールして、「ファイル」メニューから「新規プロジェクト」を選択します。

f:id:kikutaro777:20140129003000j:plain

MavenでWebアプリケーションを選択します。

f:id:kikutaro777:20140129003149j:plain

プロジェクト名やグループIDなどを適当に設定します。

f:id:kikutaro777:20140129003209j:plain

せっかくなので、JavaEE 7で作ります。GlassFishは4です。
Java EE6で作ります。GlassFishは3.1.2.2です。

f:id:kikutaro777:20140129014125j:plain

プロジェクトが生成されました。

f:id:kikutaro777:20140129003307j:plain

Entityクラスを自動生成

次にEntityクラスをNetBeansから自動生成していきます。

プロジェクトのソースパッケージを右クリックして「新規」メニューから「その他」を選びます。
もし既に「データベースからのエンティティクラス…」が表示されていれば、それを選んでも大丈夫です。

f:id:kikutaro777:20140129003721j:plain

「持続性」から「データベースのエンティティ・クラス」を選択します。

f:id:kikutaro777:20140129003831j:plain

データ・ソースから「新しいデータ・ソース」を選択してJNDI名を適当に決めてデータベース接続で以下図の青選択されたものを選びます。

f:id:kikutaro777:20140129004029j:plain

データベースのApache Derbyが起動して

f:id:kikutaro777:20140129004053j:plain

以下のように「使用可能な表」が選択されたら、全て選択して「追加」を押します。
部分的な選択でもいいです。

f:id:kikutaro777:20140129004127j:plain

f:id:kikutaro777:20140129004134j:plain

以降は「次へ」で流します。本来はパッケージ名を変えたり、コレクション型をListにしたり、と真面目に設定するのがいいと思いますが、今回はサンプルなのでデフォルトのままで進めます。

f:id:kikutaro777:20140129004225j:plain

f:id:kikutaro777:20140129004230j:plain

これでEntityクラスが生成されました。

f:id:kikutaro777:20140129004311j:plain

ビューを自動生成する

次にJSFのビューを自動生成します。ここが「New PrimeFaces code generators」に関連するメイン部分となるようです。

まずはプロジェクトを右クリックして「新規」メニューから「その他」を選択します。

f:id:kikutaro777:20140129004705j:plain

「JavaServer Faces」から「エンティティからのJSFページ・クラス」を選択します。

f:id:kikutaro777:20140129005026j:plain

エンティティクラスを全て選択して「追加」を押します。

f:id:kikutaro777:20140129005051j:plain

f:id:kikutaro777:20140129005057j:plain

そしてここが肝心ですが、一番下の「Choose Templates」のプルダウンを選ぶと「PrimeFaces」と出てくるので選択します。
どうやらテンプレートを選択できる機能っぽいですね。

f:id:kikutaro777:20140129005203j:plain

JSFは2.2 2.1で

f:id:kikutaro777:20140129014235j:plain

コンポーネントタブを選択して、PrimeFacesをチェックします。ここは自動で入って欲しい気もしますが…(^^;
しばらく待つ場合もあります。

f:id:kikutaro777:20140129005310j:plain

完了すると、まるで黒魔術のようにワラワラと自動生成されます(^^;

f:id:kikutaro777:20140129005359j:plain

待て…オイラは1行もコード書いてないんだぜ…といいながら実行すると最初に紹介した画面が全て生成されます(^^)

……

NetBeansとPrimeFaces、ちょっとやりすぎでは(^^;

っていうか、この一連の自動化を定義する方法を知りたいっ。

Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~SSL対応の補足編~

前にブログで書いた「Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~NetBeans編~」が、自分のJava EE記事なんかより全然アクセス数が高くて…汗、Twitter使って何かプログラムを作ってみたい!という方の多さを感じると共に、やはりTwitter4Jすごいなぁと(^^;

上記のようなものを書いておきながら、自分自身が情報をキャッチできていなかったのですが…Twitter APIの仕様が少し変わったようで、上記ブログ内容のままだと動かないようになっていました。

恥ずかしながらブログにコメントを頂いて気づきました…すみません。

一番良い対応方法は

最新バージョン(2014/1/18時点)の3.0.5に変更する

のようです。

どうしても3.0.3のバージョンを変えたくない…みたいな事情があれば(ない気がしますが…)

「http.useSSL=true」をプロパティに追加する

でも動かせるので、あまり推奨されないと思いますが、workaroundとして設定してみて下さい。

試しに両方でテストツイートしてみた所、後者のほうでTwitter4J開発者の@yusukeさんからコメント頂きました(^^;何か3.0.3でつぶやいてしまって、すみません…。


というわけで、3.0.5使いましょう!

一応どちらも手元で実際に確認したので以下記述しておきます。

ちなみに3.0.3のままだと

参考までに、前に書いた「Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~NetBeans編~」の手順そのままに実行すると、Twitter4Jのバージョンが3.0.3で書いていたので

Exception in thread "main" Server returned HTTP response code: 403 for URL: h ttp://api.twitter.com/1.1/account/verify_credentials.json

といったエラーが出てしまいます。

Twitter4J 3.0.5に変更する

Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~NetBeans編~」にある「依存性追加」の所

f:id:kikutaro777:20140118003256j:plain

ここの3.0.3を

<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-core</artifactId>
    <version>3.0.5</version>
</dependency>

とするだけです。実行すると

標準出力では

なまえ   :キクタロー
ひょうじ名 :kikutaro_
ふぉろわー数:241
ふぉろー数 :356

と出て、ツイートも

1分もかからない修正(^^)

http.useSSL=trueを指定する

こちらはTwitter4Jの3.0.3をどうしても使いたい、という場合の対処ですが「Twitter4Jを使ったら10分でつぶやきJavaプログラムが作れました! ~NetBeans編~」でプロパティを追加した部分

f:id:kikutaro777:20140118012629j:plain

ここのプロパティの最後に「http.useSSL=true」を追加します。

debug=true
oauth.consumerKey=*********************
oauth.consumerSecret=******************************************
oauth.accessToken=**************************************************
oauth.accessTokenSecret=******************************************
http.useSSL=true

標準出力は先ほどと同じで、ツイートも

とちゃんとできました(^^)

どっちも簡単すぎる(^^;

その他

Twitterで

とコメント頂いて、バージョン範囲指定って何!?と、私自身Mavenのバージョン範囲指定を知りませんでした…(^^;
調べたら、以下のような情報が。こんな書き方できたのか…。

Mavenのバージョン番号の理解
http://docs.oracle.com/cd/E50629_01/core/MAVEN/maven_version.htm

試しにMavenで

<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-core</artifactId>
    <version>[3,)</version>
</dependency>

と書いてみました。
すると、手元にない3.0.1や3.0.2,3.0.4がずらずらDownloadされていき、最終的には3.0.5が参照されていました。

うーむ。Maven奥深い(^^;まだまだ勉強が足りないようです。

はじめてのWindows Azure ~NetBeansのコード生成でJPAからSQLデータベースへ~

昨日書いた

はじめてのWindows Azure ~SQLデータベース作成からNetBeansでの接続まで~

にて、AzureでSQLデータベースを生成して、NetBeansのデータベースサービスと簡単に連携できました。

ということは、ここからNetBeansの自動生成機能を使えば簡単にデータベース処理のWebアプリが作れるわけで、やってみました。

ここに来るとあまりAzure関係ないですね…(^^;
ちなみにWidnows 8 Proの64bitでJDK8、NetBeans7.4でGlassFish4.0にて行いました。

続きを読む
にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村