【Java・SpringBoot】JPAでRepositoryを使うときの設定の注意点
どうも、jpaを使おうとしてまたハマったタツノコです。
環境構築は難しい。
以前の記事にてSpringBootのアノテーション周りの設定を読み込む記述の記事を書きました。
springBootの環境構築
それに引き続きRepositoryの設定をしようと思ったのですが、
また起動時にエラーが発生しました。
それの解決方法を書きます。
起きた事象
以前作ったプロジェクトと同じ構成で「SpringTest2」プロジェクトを作りました。
インターフェースのRepositoryを作って、「@Repository」を付与しました。
そして起動したところ、以下のエラーが発生。
Consider defining a bean of type ‘リポジトリーインターフェースのあるパッケージ’ in your configuration.
環境とApplicationクラスの設定
- Java 1.8
- STS 3.9.2
- Spring Bootバージョン 1.5.10
- MySQL
Applicationクラス
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages={"com.example.controller"})
@EntityScan("com.example.entity") //←こちらの説明はまた次回
public class SpringTest2Application {
public static void main(String[] args) {
SpringApplication.run(TestProjectApplication.class, args);
}
}
Entityクラス
※テーブル:userInfo
カラム:id、pref、addres1、address2、name、graderIdがあるテーブルが作られている前提です。
package com.example.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="userInfo")
public class UserInfoEntity {
@Id
@Column(name="id")
private Integer id;
@Column(name="pref")
private String pref;
@Column(name="address1")
private String address1;
@Column(name="address2")
private String address2;
@Column(name="name")
private String name;
@Column(name="graderId")
private String graderId;
@ManyToOne
private GraderEntity graderEntity;
// 〜〜GetterメソッドおよびSetterメソッドは省略〜〜
}
Repositoryインターフェース
package com.example.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import com.example.entity.UserInfoEntity;
@Repository
public interface UserInfoRepository extends JpaRepository<UserInfoEntity,Integer>,JpaSpecificationExecutor<UserInfoEntity>{
}
エラーの理由
エラーの理由を探すために、色々探してみましたが、
以下のサイトが参考になりました。
どうやら、Repositoryを使うときは@SpringBootApplicationがついたクラスに
以下のアノテーションを追加しないと
実行時に読み込んでくれないみたいです。
@EnableJpaRepositories("Repositoryインターフェースがあるパッケージ")
Repositoryインターフェースを修正した結果
というわけで以下の書き方になりました。
Applicationクラス
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);
}
}
サーバを起動した結果
上手く起動してくれました。
まとめ
初期のspringに比べて、設定ファイルがほとんどなくて
アノテーションで色々できるようになっていますが、
アノテーションの意味と、springの動きをしっかり理解しておかないと
ハマってしまいますね。
次回はEntityを使う場合のアノテーションの設定について、書こうと思います。
今回は以上!!!
ディスカッション
コメント一覧
まだ、コメントがありません