ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

WildFlyでgetResourceするとパスが異なる事例と対処方法

GlassFishで動作していたSpringBootアプリを、サーバー移管に伴いWildFlyに切り替えました。

動作確認をしていくと、リソースの取得で404が返ってきて困っていました。

いろいろと調査すると、パスの取得方法がアプリケーション・サーバーによって異なることがあるらしく、その場合の対処方法をまとめました。

環境

WildFly 15.0.1 Final
・Spring Boot 1.3.6 RELEASE
CentOS 7
Eclipse 4.8
・アプリはWARでデプロイ

WilfFly上での問題の挙動

GlassFishでは、アプリをWAR形式でデプロイし動作させていました。
WildFlyでも同じようにして動作させていたのですが、Excelを出力する処理で、404が発生し原因を調査することにしました。

GlassFishでは、次のコードで正常に動作していました。

new File(this.getClass().getResource(srcFullPath).getPath());


このコードのままWildFlyで処理を行うと変なパスが返ってきます。
(ローカルでWARデプロイしたとき)

# getResourceで引数に「"."」を指定した場合
/Users/user_name/dev/eclipse/server/wildfly-15/modules/system/layers/base/org/jboss/as/ejb3/main/timers/

# getResourceで引数に「"report"」のパスを指定した場合
/content/Hoge.war/WEB-INF/classes/com/test/report/  

いろいろと調べてみる

解決しないとマズイ問題なのでめちゃくちゃ調べました。

How to put an external file in the classpath |JBoss Developer
java - WildFly - getting resource from WAR - Stack Overflow
How to load a file in war file |JBoss Developer
How to load external property file in JBoss 7 classpath? - JBoss 7 Configurations

基本、英語のサイトしかヒットしないのでGoogle翻訳を駆使したり、コードから読み取ったりしてました。

サイトには、「それは解決できないよ」と絶望的な回答があったり、「この方法はどう?」と試すものの的外れだったりで、困り果ててました。

そんな中、「解決方法はこれ!」というのがあり、試すと問題なく動作するものがありました!!

解決方法

java - How to load resource files in jboss war - wildfly9.xV - Stack Overflow

getResource()でFileを取得するのではなく、getResourceAsStream()でStreamを取得して使えとのこと。

this.getClass().getResourceAsStream(path);

これですんなりExcelを出力できるようになりました。

SpringBootのJacksonで日付フォーマットを設定する方法

SpringBootのコントローラーの戻り値に@ResponseBodyを設定して、オブジェクトでJSONを返すとき、日付型はlongで扱われます。
それを適切は日付フォーマットにするには、設定ファイル、アノテーションで設定できます。

application.propertiesによる設定

アプリケーション全体の設定として適用されます。
タイムゾーン設定をしないと、日付がずれるので必ず設定しておきましょう。

application.properties

spring.jackson.date-format=yyyy/MM/dd'T'HH:mm:ss.SSSZ
spring.jackson.time-zone=Asia/Tokyo

アノテーションによる設定

JSONマッピングするオブジェクトクラスの日付フィールドで@JsonFormatアノテーションを設定します。
アノテーションでもタイムゾーンの設定ができます。

オブジェクトクラス

@JsonFormat(pattern = "yyyy/MM/dd")
private Date date;

@JsonFormat(pattern = "yyyy/MM/dd", timezone = "Asia/Tokyo")
private Date date;

PostgreSQLを自己証明書でSSLに対応する

手順通りにすれば、簡単にPostgreSQLSSLに対応できます。

動作環境

OS CentOS 6.4
PostgreSQL 9.3.2
OpenSSL 1.0.1e-fips 11 Feb 2013

自己証明書を作成する

1.PostgreSQLのdataディレクトリに移動する

$ cd /var/lib/pgsql/9.3/data

2.OpenSSLでRSA秘密鍵を作成する

# 2048はビット数
$ openssl genrsa 2048 > server.key

3.OpenSSLでCSRを作成する

$ openssl req -new -key server.key > server.csr

4.OpenSSLで証明書を作成する

# 36500は有効期限(この場合100年)
$ openssl x509 -days 36500 -req -signkey server.key < server.csr > server.crt 

5.作成したファイルの所有権・グループを変更する

$ chown postgres:postgres server.*

6.server.keyのアクセス権限を変更する

$ chmod 600 server.key

PostgreSQLの設定を変更する

1.pg_hba.confでアクセス権を変更する

$ vi /var/lib/pgsql/9.3/data/pg_hba.conf

# IPv4 local connections:
host     all     all     127.0.0.1/32     md5  # ローカルはSSL不要
hostssl     all     all     0.0.0.0/0     md5  # リモートはSSL必須

2.postgresql.confでSSLを有効にする

$ vi /var/lib/pgsql/9.3/data/postgresql.conf

# コメントアウトされているので、コメントを外し「ssl = on」にする
# ssl = off
ssl = on

3.設定を有効にするためPostgreSQLを再起動する

$ service postgresql-9.3 restart

注意事項

TomcatGlassFishなどのアプリケーションサーバーを利用している場合、PostgreSQLを再起動する前に停止しておく必要があります。
起動したままだと、データベースとの連携が行われなくなり接続エラーが発生します。

PostgreSQLの再起動が失敗した場合、エラーメッセージがログに出力されるので、そちらを参照し問題点を修正して下さい。
pg_logディレクトリ内に発生曜日ごとにログがあります。

/var/lib/pgsql/9.3/data/pg_log

SSL設定後のPostgreSQLへの接続

GUIツールは、SSLの設定を追加して接続するだけです。

psqlコマンドで接続する場合、接続情報を「""」で括り、「sslmode=require」を追加します。

psql "sslmode=require host=xxx.xxx.xxx.xxx user=user1 dbname=db1"

SSL設定後のアプリケーション側での接続文字列変更

Java

接続文字列に「?sslmode=require」を追加します。

jdbc:postgresql://xxx.xxx.xxx.xxx:5432/dbname?sslmode=require

.NET

接続文字列に「SSL Mode = Require; Trust Server Certificate = true; 」を追加します。

Host=xxx.xxx.xxx;Database=dbname;Username=user;Password=pass;SSL Mode=Require;Trust Server Certificate=True

PostgreSQLを深く知るためにおすすめの書籍

内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

PostgreSQL全機能バイブル

PostgreSQL全機能バイブル

Thymeleaf2.xでの「少し困った!」に役立つミニリファレンス集

Thymeleafを使用した開発で、実際に少し困ったことについてまとめてみました。

これから利用する方の役に立てればと思います。

リンクにパラメーターを含める

変数${}の前後に__を追加し、__${}__の形にする。

<a th:href=“@{/hoge/__${e.no}__/add}">hoge</a>

formタグのactionに文字列変数を展開する

変数に定義した文字列をリンクとして展開する場合、@{}内に${}で変数を定義する。

<!-- 通常の文字指定 -->
<form th:action=“@{/hoge}” method=“post”>

<!-- 変数指定 -->
<form th:action=“@{${hoge}}” method=“post”>

「data-」属性に値を設定する

<span th:attr="data-hoge=${hoge}">hoge</span>

変数を含んだ文字列の展開

「|」で括る

<span th:text=“|${hoge}です。|”/>

JavaScriptで変数を扱う

<script>タグにth:inline="javascript"を追加し、/*<![CDATA[*//*]]>*/で括る。
その中での変数は、/*[[]]*/で括る。

<script th:inline="javascript">
/*<![CDATA[*/
    /*[[@{/hoge}]]*/
/*]]>*/
</script>

JavaScriptで変数を文字で連結する

変数を/*[++]*/で括る。

<script th:inline="javascript">
/*<![CDATA[*/
    var val = "aaa" + /*[+ [[${hoge}]]  +]*/;
/*]]>*/
</script>

比較演算子

Thymeleafでは、比較演算子がそのままでは使えないので、次の標記を使用する。

> gt
< lt
>= ge
<= le

変数を文字列として扱い比較する

パスを含む変数を比較したい場合、''で変数を文字列化すると比較できる。

<span th:if="${'__*{path}__' == '/hoge'}">hoge</span>

Thymeleafの記載がある書籍

MacでJavaのインストールとバージョンの切り替えを行う

Javaのインストール

1.OracleサイトよりMac版のJDK単体をダウンロードします

Java SE Development Kit 8 - Downloads

2.ダウンロードしたdmgファイルを実行し、インストールを行います

3.ターミナルを起動し、Javaのバージョンを確認します

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

Javaの切り替え

Macでは複数バージョンのJavaをインストールできます。

1.ターミナルを起動し、現在インストールされているJavaの一覧を表示します

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
    1.8.0_144, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
    1.7.0_80, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

2.現在使用されているJavaのバージョンを確認します。

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

3.「.bash_profile」に環境変数JAVA_HOME」を追加し、使用するJavaバージョンを指定します。

$ vi ~/.bash_profile

# 以下を追記する、下記の1.7を1.6等に変更するとそのバージョンに変わる
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
export PATH=${JAVA_HOME}:${PATH}

4.「.bash_profile」を再ロードして設定を有効に、Javaバージョンが変わっているか確認します

$ source ~/.bash_profile
$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

元のバージョンに戻すには、「.bash_profile」に追加した環境変数を削除またはコメントアウトし、再ロードすれば戻ります。

Javaのアンインストール

Javaをインストールすると追加でインストールされ、古いJavaが残ったままになるので、その都度削除が必要です。

1.ターミナルを起動し、現在インストールされているJavaの一覧を表示します

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
    1.8.0_144, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
    1.7.0_80, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

2.削除コマンドを使って削除したいJavaのパスを指定し、削除します

$ rm -Rf /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk

「doma-spring-boot-starter」を使ってSpringBootとDomaの連携を楽にする

JavaのDBアクセスフレームワーク「Doma2」にSpringBootと連携し自動で設定してくれる「doma-spring-boot-starter」が追加されました。

今までは独自にDoma用のクラスを作成し連携していましたが、それをする必要がなくなり導入と設定が楽になりました。


github.com

doma-spring-boot-starter」の適用概略

1.build.gradleに「https://oss.sonatype.org/content/repositories/snapshots」のリポジトリを追加する

2.build.gradleに「org.seasar.doma.boot:doma-spring-boot-starter」の依存を追加する

3.application.propertiesに必要であればdoma用の設定を追加する

doma-spring-boot-starter」を使うことでdoma設定クラスが不要になります。
application.propertiesdoma.namingを追加することで、@EntityNamingTypeの定義が不要になります。

サンプルコード

build.gradle

repositories {
	mavenCentral()
	// 追記
	maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}

dependencies {
	// 追記
	compile('org.seasar.doma.boot:doma-spring-boot-starter:1.0.2')
	// 削除
	//compile('org.seasar.doma:doma:2.6.2')
}

src/main/resources/application.properties

# DB
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:test_db
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

# DOMA
doma.dialect=ORACLE
doma.naming=SNAKE_LOWER_CASE

src/main/java/com.example.dao.EmpDao

package com.example.dao;

import java.util.List;

import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;

import com.example.entity.Emp;

@ConfigAutowireable
@Dao
public interface EmpDao {

	@Select
	List<Emp> findAll();
}

src/main/java/com.example.entity.Emp

package com.example.entity;

import java.util.Date;

import org.seasar.doma.Entity;
import org.seasar.doma.Id;

// application.propertiesの「doma.naming」で指定済みなので不要
//@Entity(naming = NamingType.SNAKE_LOWER_CASE)
@Entity
public class Emp {

	@Id
	public String empNo;

	public String empNm;
}

src/main/java/com.example.web.TestController

package com.example.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.dao.EmpDao;
import com.example.entity.Emp;

@Controller
public class TestController {

	@Autowired
	private EmpDao empDao;

	@RequestMapping("/test")
	public String index() {

		List<Emp> list = empDao.findAll();
		for (Emp emp : list) {
			System.out.println(emp.empNo);
		}

		return "test/test";
	}

Domaのエンティティ等にLombokを使うと競合するので注意

SpringBoot+Domaの検証を行っていて、WARファイルでも作ってみるかとGradleからビルドしたら、何回やってもコンパイルエラーになって困った。
いきなりミュータブルとか言われてもよく分からない。

エラー: [DOMA4124] ミュータブルなエンティティクラスは非privateな引数なしのコンストラクタを持たねばなりません。イミュータブルにするには@Entityのimmutable要素にtrueを設定してください。
public class Emp {
       ^
エラー1:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more l
og output.

BUILD FAILED


Eclipse上ではエラーが出てないのになんで?と思ってググってみたら、次のツイートが目についた。


コンストラクタの自動生成で競合してるようです。
DomaのエンティティクラスにあるLombokの@Dataアノテーションを削除したらビルドできました。


基本的にDomaのエンティティはpublicフィールド対応してるのでLombokは不要です。
SpringBootを検証しているうちにいつのまにかエンティティに@Dataを付与してしまってたみたいです…。


# 2014/10/09 追記

ソース

環境

Eclipse 4.3

Dept.java

package demo.entity;

import lombok.Data;

import org.seasar.doma.Entity;
import org.seasar.doma.Id;
import org.seasar.doma.jdbc.entity.NamingType;

@Data
@Entity(naming = NamingType.SNAKE_LOWER_CASE)
public class Dept {

	@Id
	public String deptNo;

	public String deptNm;
}

build.gradle

buildscript {
    ext {
        springBootVersion = '1.1.5.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot' 
apply plugin: 'war'

/*
jar {
    baseName = 'demo'
    version =  '1.0'
}*/
war {
	baseName = 'demo'
	version =  '1.0'
}
sourceCompatibility = 1.7
targetCompatibility = 1.7

// for Doma
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
processResources.destinationDir = compileJava.destinationDir
compileJava.dependsOn processResources

def aptGeneratePath = '.apt_generated'
compileJava.options.compilerArgs = ['-s', aptGeneratePath]
new File(aptGeneratePath).mkdirs()

repositories {
    mavenCentral()
	maven {url 'http://maven.seasar.org/maven2'}
}

configurations {
	providedRuntime
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-aop")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.hibernate:hibernate-validator")
    compile("org.springframework:spring-jdbc")
    compile("org.seasar.doma:doma:1.+")
    compile("org.seasar.container:s2-tiger:2.4.47")
    compile files("C:/app/lib/jdbc/ojdbc7.jar")
    compile files("C:/app/lib/lombok/lombok-1.14.8.jar")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
    //testCompile("org.springframework.boot:spring-boot-starter-test")
}

eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.12'
}


# 2014/10/10 追記

クラスファイル

「javap クラスファイル名」の結果

@Dataがない状態

Deptクラスのアウトライン

f:id:shinsuke789:20141010121806p:plain

Dept.class

Compiled from "Dept.java"
public class demo.entity.Dept {
  public java.lang.String deptNo;
  public java.lang.String deptNm;
  public demo.entity.Dept();
}

_Dept.class

Compiled from "_Dept.java"
public final class demo.entity._Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType<demo.entity.Dept> {
  public final org.seasar.doma.jdbc.entity.BasicPropertyType<java.lang.Object, demo.entity.Dept, java.lang.String, java.lang.Object> $deptNm;
  public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType<java.lang.Object, demo.entity.Dept, java.lang.String, java.lang.Object> $deptNo;
  static {};
  public org.seasar.doma.jdbc.entity.NamingType getNamingType();
  public boolean isImmutable();
  public java.lang.String getName();
  public java.lang.String getCatalogName();
  public java.lang.String getSchemaName();
  public java.lang.String getTableName();
  public java.lang.String getQualifiedTableName();
  public void preInsert(demo.entity.Dept, org.seasar.doma.jdbc.entity.PreInsertContext<demo.entity.Dept>);
  public void preUpdate(demo.entity.Dept, org.seasar.doma.jdbc.entity.PreUpdateContext<demo.entity.Dept>);
  public void preDelete(demo.entity.Dept, org.seasar.doma.jdbc.entity.PreDeleteContext<demo.entity.Dept>);
  public void postInsert(demo.entity.Dept, org.seasar.doma.jdbc.entity.PostInsertContext<demo.entity.Dept>);
  public void postUpdate(demo.entity.Dept, org.seasar.doma.jdbc.entity.PostUpdateContext<demo.entity.Dept>);
  public void postDelete(demo.entity.Dept, org.seasar.doma.jdbc.entity.PostDeleteContext<demo.entity.Dept>);
  public java.util.List<org.seasar.doma.jdbc.entity.EntityPropertyType<demo.entity.Dept, ?>> getEntityPropertyTypes();
  public org.seasar.doma.jdbc.entity.EntityPropertyType<demo.entity.Dept, ?> getEntityPropertyType(java.lang.String);
  public java.util.List<org.seasar.doma.jdbc.entity.EntityPropertyType<demo.entity.Dept, ?>> getIdPropertyTypes();
  public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType<java.lang.Object, demo.entity.Dept, ?, ?> getGeneratedIdPropertyType();
  public org.seasar.doma.jdbc.entity.VersionPropertyType<java.lang.Object, demo.entity.Dept, ?, ?> getVersionPropertyType();
  public demo.entity.Dept newEntity();
  public demo.entity.Dept newEntity(java.util.Map<java.lang.String, java.lang.Object>);
  public java.lang.Class<demo.entity.Dept> getEntityClass();
  public demo.entity.Dept getOriginalStates(demo.entity.Dept);
  public void saveCurrentStates(demo.entity.Dept);
  public static demo.entity._Dept getSingletonInternal();
  public static demo.entity._Dept newInstance();
  public void postDelete(java.lang.Object, org.seasar.doma.jdbc.entity.PostDeleteContext);
  public void preInsert(java.lang.Object, org.seasar.doma.jdbc.entity.PreInsertContext);
  public void postUpdate(java.lang.Object, org.seasar.doma.jdbc.entity.PostUpdateContext);
  public void saveCurrentStates(java.lang.Object);
  public void preDelete(java.lang.Object, org.seasar.doma.jdbc.entity.PreDeleteContext);
  public void postInsert(java.lang.Object, org.seasar.doma.jdbc.entity.PostInsertContext);
  public java.lang.Object getOriginalStates(java.lang.Object);
  public java.lang.Object newEntity(java.util.Map);
  public java.lang.Object newEntity();
  public void preUpdate(java.lang.Object, org.seasar.doma.jdbc.entity.PreUpdateContext);
}

@Dataを付与した状態

Deptクラスのアウトライン

f:id:shinsuke789:20141010091257j:plain

Dept.class
Compiled from "Dept.java"
public class demo.entity.Dept {
  public java.lang.String deptNo;
  public java.lang.String deptNm;
  public java.lang.String getDeptNo();
  public java.lang.String getDeptNm();
  public void setDeptNo(java.lang.String);
  public void setDeptNm(java.lang.String);
  public boolean equals(java.lang.Object);
  protected boolean canEqual(java.lang.Object);
  public int hashCode();
  public java.lang.String toString();
  public demo.entity.Dept();
}
_Dept.class
Compiled from "_Dept.java"
public final class demo.entity._Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType<demo.entity.Dept> {
  public final org.seasar.doma.jdbc.entity.BasicPropertyType<java.lang.Object, demo.entity.Dept, java.lang.String, java.lang.Object> $deptNm;
  public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType<java.lang.Object, demo.entity.Dept, java.lang.String, java.lang.Object> $deptNo;
  static {};
  public org.seasar.doma.jdbc.entity.NamingType getNamingType();
  public boolean isImmutable();
  public java.lang.String getName();
  public java.lang.String getCatalogName();
  public java.lang.String getSchemaName();
  public java.lang.String getTableName();
  public java.lang.String getQualifiedTableName();
  public void preInsert(demo.entity.Dept, org.seasar.doma.jdbc.entity.PreInsertContext<demo.entity.Dept>);
  public void preUpdate(demo.entity.Dept, org.seasar.doma.jdbc.entity.PreUpdateContext<demo.entity.Dept>);
  public void preDelete(demo.entity.Dept, org.seasar.doma.jdbc.entity.PreDeleteContext<demo.entity.Dept>);
  public void postInsert(demo.entity.Dept, org.seasar.doma.jdbc.entity.PostInsertContext<demo.entity.Dept>);
  public void postUpdate(demo.entity.Dept, org.seasar.doma.jdbc.entity.PostUpdateContext<demo.entity.Dept>);
  public void postDelete(demo.entity.Dept, org.seasar.doma.jdbc.entity.PostDeleteContext<demo.entity.Dept>);
  public java.util.List<org.seasar.doma.jdbc.entity.EntityPropertyType<demo.entity.Dept, ?>> getEntityPropertyTypes();
  public org.seasar.doma.jdbc.entity.EntityPropertyType<demo.entity.Dept, ?> getEntityPropertyType(java.lang.String);
  public java.util.List<org.seasar.doma.jdbc.entity.EntityPropertyType<demo.entity.Dept, ?>> getIdPropertyTypes();
  public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType<java.lang.Object, demo.entity.Dept, ?, ?> getGeneratedIdPropertyType();
  public org.seasar.doma.jdbc.entity.VersionPropertyType<java.lang.Object, demo.entity.Dept, ?, ?> getVersionPropertyType();
  public demo.entity.Dept newEntity();
  public demo.entity.Dept newEntity(java.util.Map<java.lang.String, java.lang.Object>);
  public java.lang.Class<demo.entity.Dept> getEntityClass();
  public demo.entity.Dept getOriginalStates(demo.entity.Dept);
  public void saveCurrentStates(demo.entity.Dept);
  public static demo.entity._Dept getSingletonInternal();
  public static demo.entity._Dept newInstance();
  public void postDelete(java.lang.Object, org.seasar.doma.jdbc.entity.PostDeleteContext);
  public void preInsert(java.lang.Object, org.seasar.doma.jdbc.entity.PreInsertContext);
  public void postUpdate(java.lang.Object, org.seasar.doma.jdbc.entity.PostUpdateContext);
  public void saveCurrentStates(java.lang.Object);
  public void preDelete(java.lang.Object, org.seasar.doma.jdbc.entity.PreDeleteContext);
  public void postInsert(java.lang.Object, org.seasar.doma.jdbc.entity.PostInsertContext);
  public java.lang.Object getOriginalStates(java.lang.Object);
  public java.lang.Object newEntity(java.util.Map);
  public java.lang.Object newEntity();
  public void preUpdate(java.lang.Object, org.seasar.doma.jdbc.entity.PreUpdateContext);
}

# 2014/10/14 追記

@Dataのみ付与、Gradleでコンパイル

Dept.class
Compiled from "Dept.java"
public class demo.form.Dept {
  public java.lang.String deptNo;
  public java.lang.String deptNm;
  public demo.form.Dept();
  public java.lang.String getDeptNo();
  public java.lang.String getDeptNm();
  public void setDeptNo(java.lang.String);
  public void setDeptNm(java.lang.String);
  public boolean equals(java.lang.Object);
  protected boolean canEqual(java.lang.Object);
  public int hashCode();
  public java.lang.String toString();
}

原因

まだ特定はできてないですが、私の環境だけで起こる現象のようです。