【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を使う場合のアノテーションの設定について、書こうと思います。

今回は以上!!!

スポンサーリンク

Java

Posted by タツノコ