【Spring Boot】Bean が見つからないエラーをやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Boot を使っていると、
「Bean が見つからない」 というエラーに必ず出会います。

  • 起動時に落ちる
  • DI がうまくいかない
  • @Autowired でエラーになる
  • Service が見つからないと言われる

こういったエラーは、
Bean の仕組みとスキャン範囲 を理解すると一気に解決します。

この記事では、Bean が見つからないときに
最初に確認すべきポイントを
やさしく・実務寄り で整理していきます。


よく出るエラーメッセージ

NoSuchBeanDefinitionException

No qualifying bean of type 'UserService' available

UnsatisfiedDependencyException

Error creating bean with name 'userController':
Unsatisfied dependency expressed through field 'userService'

どちらも 「DI したい Bean が見つからない」 という意味です。


Bean が見つからない原因(全体像)

1. アノテーションの付け忘れ
2. パッケージがスキャン範囲外
3. インターフェースと実装の不一致
4. @Profile による除外
5. Bean が複数あってどれを使うか決められない
6. コンストラクタの依存関係が循環している

アノテーションの付け忘れ(最も多い)

よくあるミス

  • @Service を付け忘れ
  • @Repository を付け忘れ
  • @Component を付け忘れ

Java
public class UserService { ... } // ← @Service がない

対策

Java
@Service
public class UserService { ... }

Bean として登録されていない → 見つからない
というシンプルな原因です。

パッケージがスキャン範囲外

Spring Boot は Application クラスのパッケージ配下を自動スキャン します。

よくあるミス

com.example.demo   ← Application
com.example.service ← ここは OK
com.other.service ← ここはスキャンされない

対策

  • Application と同じ階層か配下に置く
  • または @ComponentScan を使う

インターフェースと実装の不一致

よくあるミス

Java
@Autowired
private UserService userService; // インターフェース

@Service
public class UserServiceImpl2 implements UserService { ... } // 名前違い

Bean 名が違っても問題ありませんが、
実装クラスが存在しない とエラーになります。

@Profile による除外

よくあるミス

Java
@Profile("prod")
@Service
public class ProdMailService { ... }

dev で起動しているのに prod の Bean を探してしまうパターン。

対策

  • active プロファイルを確認
  • @Profile の指定を見直す

Bean が複数あってどれを使うか決められない

よくあるエラー

NoUniqueBeanDefinitionException

Java
@Service
public class AService implements XService { }

@Service
public class BService implements XService { }

対策

Java
@Qualifier("aService")
private XService service;

循環依存(Circular Dependency)

よくあるパターン

  • AService が BService を @Autowired
  • BService が AService を @Autowired

エラー例

Requested bean is currently in creation

対策

  • 設計を見直す
  • 片方をコンストラクタ DI → setter DI に変更

実務でのチェックリスト

アノテーションは付いているか

@Service / @Repository / @Component

Application 配下にあるか

パッケージ構造を確認。

インターフェースと実装は一致しているか

実装クラスが存在するか。

@Profile で除外されていないか

active プロファイルを確認。

Bean が複数ないか

NoUniqueBeanDefinitionException を確認。

循環依存がないか

依存関係を見直す。


ログの読み方(おさらい)

Bean が見つからないときは、
ログの最後にこう出ます。

UnsatisfiedDependencyException
NoSuchBeanDefinitionException

そして Caused by の行に真犯人が書かれています。


まとめ

Bean が見つからないエラーは、

「Bean が登録されていない」
「スキャンされていない」
「複数あって選べない」

のどれかです。

  • アノテーションの付け忘れ
  • パッケージがスキャン範囲外
  • インターフェースと実装の不一致
  • @Profile による除外
  • Bean が複数
  • 循環依存

難しく聞こえますが、
「Bean が登録されているか?」
「Spring がそのクラスを見えているか?」
の 2 点を確認すれば十分です。


decopon
decopon

Bean が見つからないエラーは、
最初は怖く見えますが、
“原因のパターン” を知っているだけで
落ち着いて対処できるようになります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

Spring さんが“見つけられないよ〜”って言ってるだけなんだね…
かわいいエラーだね。

コメント

タイトルとURLをコピーしました