【Java・SpringBoot】JPAでEntityを使うときの設定の注意点
どうも、前回に引き続き
今回はEntityの設定時にハマったことを書いていきます。
Repositoryの設定も行って、さぁEntityのクラス、アノテーションも書いた。
そして起動をしようと思ったら今度は別の事象が起きました。
今回もそれの解決方法を書きます。
起きた事象
以前作ったプロジェクトと同じ構成で「SpringTest2」プロジェクトを作りました。
Entityクラスを作って、「@Entity」を付与。
「@Table(name=”テーブル名”)」もつ毛ました。
そして起動したところ、今度は以下のエラーが発生。
しかも二つ例外が出ていました。
・一つ目
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userInfoController': Unsatisfied dependency expressed through field 'userInfoService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userInfoServiceImpl': Unsatisfied dependency expressed through field 'userInfoDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userInfoDaoImpl': Unsatisfied dependency expressed through field 'userInfoRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userInfoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.UserInfoEntity
・二つ目
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userInfoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.UserInfoEntity
そのとき作った構成は以下です。
・Applicationクラス
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages={"com.example.controller"})
@EnableJpaRepositories("com.example.repository")
public class SpringTest2Application {
public static void main(String[] args) {
SpringApplication.run(TestProjectApplication.class, args);
}
}
・Entityクラス
前回と全く同じ構成なので
割愛
・Repositoryインターフェース
こちらも前回と全く同じ構成なので割愛
ポイントは@SpringBootApplicationのアノテーションがついたクラスですね。
ログの見るべきポイント
二つ目の
「Not a managed type: class com.example.entity.UserInfoEntity」
の部分です
エラーの理由
エラーの理由を探すために、色々探してみましたが、
以下のサイトが参考になりました。
@Entityを使うためには以下のアノテーションを@SpringBootApplicationと同じクラスに
付与してあげなくてはいけない模様
@EntityScan("Entityクラスの存在するパッケージ")
おそらく。EntityもDI管理するために必要みたいです。
さらにいうと、@SpringBootApplication内で指定している「scanBasePackages」で
管理できない項目だと思われます。
※確か@Controller、@Service、@Componentまでを管理するものです。
アノテーションで大事なこと
重要なのは、DI管理を行うために、
「どのクラスはどのアノテーションで管理できるか」
というのを知ることだと思います。
ちなみに・・・プロパティメッセージなどのファイルあたりも、もしかしたら
このクラスでアノテーションで指定しないといけないのではないかと思い始めてます。
(すみません、まだ勉強中です・・・
@EntityScanを付与した結果
Applicationクラス
※entityクラスはcom.example.entityパッケージにまとめているという前提です。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages={"com.example.controller"})
@EntityScan("com.example.entity")//←今回追加したアノテーション
@EnableJpaRepositories("com.example.repository")
public class SpringTest2Application {
public static void main(String[] args) {
SpringApplication.run(TestProjectApplication.class, args);
}
}
サーバを起動した結果
上手く起動してくれました。
記事を二つに分けた理由
RepositoryクラスとEntityクラスってだいたい同時に作るんだから、
前回の記事に
一緒にまとめた方が良いのではないかと思いました。
ですが、それぞれの設定をしていない状態だと、
出てくるエラーも違うので、あえて二つに分けました。
エラーが出た時に、目的の解決策がすぐ見つかるように分けたつもりではあります。
まとめ
サーバを起動した結果としては前回の記事と同じでしたが
一つ設定を忘れたりすることで、出てくる内容はガラッと変わります。
(そりゃそうだよね。だって、起きている原因が違うんですもの。)
同じようなことで、つまづいている方がいたり、
初心者の方が、できるだけ早く解決するために
この記事が役に立つことを願っています。
(自分がつまづいたことって、他の人もつまづく可能性があるので、
その方々の為になれたら幸いでございます)
今回は以上!!!
ディスカッション
コメント一覧
まだ、コメントがありません