WildFlyでgetResourceするとパスが異なる事例と対処方法
GlassFishで動作していたSpringBootアプリを、サーバー移管に伴いWildFlyに切り替えました。
動作確認をしていくと、リソースの取得で404が返ってきて困っていました。
いろいろと調査すると、パスの取得方法がアプリケーション・サーバーによって異なることがあるらしく、その場合の対処方法をまとめました。
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
PostgreSQLを自己証明書でSSLに対応する
手順通りにすれば、簡単にPostgreSQLをSSLに対応できます。
動作環境
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
# 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
注意事項
TomcatやGlassFishなどのアプリケーションサーバーを利用している場合、PostgreSQLを再起動する前に停止しておく必要があります。
起動したままだと、データベースとの連携が行われなくなり接続エラーが発生します。
PostgreSQLの再起動が失敗した場合、エラーメッセージがログに出力されるので、そちらを参照し問題点を修正して下さい。
pg_logディレクトリ内に発生曜日ごとにログがあります。
/var/lib/pgsql/9.3/data/pg_log
SSL設定後のPostgreSQLへの接続
psqlコマンドで接続する場合、接続情報を「""」で括り、「sslmode=require
」を追加します。
psql "sslmode=require host=xxx.xxx.xxx.xxx user=user1 dbname=db1"
SSL設定後のアプリケーション側での接続文字列変更
.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)
- 作者: 勝俣智成,佐伯昌樹,原田登志
- 出版社/メーカー: 技術評論社
- 発売日: 2014/09/04
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: 鈴木啓修
- 出版社/メーカー: 技術評論社
- 発売日: 2012/11/16
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 14回
- この商品を含むブログ (5件) を見る
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>
変数を文字列として扱い比較する
パスを含む変数を比較したい場合、''
で変数を文字列化すると比較できる。
<span th:if="${'__*{path}__' == '/hoge'}">hoge</span>
Thymeleafの記載がある書籍
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2017/05/09
- メディア: Kindle版
- この商品を含むブログを見る
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者: 株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/20
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
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の切り替え
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用のクラスを作成し連携していましたが、それをする必要がなくなり導入と設定が楽になりました。
「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.properties
にdoma.naming
を追加することで、@Entity
のNamingType
の定義が不要になります。
サンプルコード
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上ではエラーが出てないのになんで?と思ってググってみたら、次のツイートが目についた。
lombokとdomaは相性が良くなさそうな予感がするなー。domaていうかapt。どうなんだろー。
— Mitsuyuki Shiiba (@bufferings) March 12, 2014
コンストラクタの自動生成で競合してるようです。
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クラスのアウトライン
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クラスのアウトライン
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(); }
原因
まだ特定はできてないですが、私の環境だけで起こる現象のようです。