質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.71%

SpringbootでDIされる項目がnullの時の原因特定方法

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 19K+

Koozy

score 53

Springbootを使用して業務アプリケーション開発をしています。
DIという考え方に慣れておりません。

@Autowiredアノテーションを使用してDI(依存性の注入)を行うコードがあったとします。
このとき、設定ファイルが正常に記載されていないなどの理由でDIが正常に行われず、
@Autowiredアノテーションを付与したインスタンス変数がnullのまま、
DIによるインスタンス化がされないことがあります。

この時に「DIが失敗したんだな」ということは理解できるんですが、
何を原因として失敗したかを知る術は無いものか、ということが質問の趣旨となります。
実行時にNullPointerExceptionが出るだけで何が悪いのかがわからず、
原因究明に時間が掛かっており何かいい手はないものかと探していますが見つけきれていません。

また、前述の通り八方塞になった場合にDIによってインスタンス化せず、フレームワークの
DI向けに作られたクラスであってもJavaコード上で通常通りnewでインスタンス化して
ゴテゴテとコーディングすることについての賛否やご意見なども伺えると嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

NullPointerしか出てこないとありますが、スタックトレースを読む癖はつけていますか?
Springのエラーメッセージはかなり親切ですよ。DI失敗関連のエラーでは大抵の場合、併発してBeanCreationExceptionが発生し、そこに原因が書いているはずです。

DIに失敗するパターンとしては以下のようなものが挙げられます。
①Autowiredアノテーションのつけ忘れ
[発生する例外]NullPointerExceptionが単独で発生し、BeanCreationExceptionが同時に発生しない
[対処]@Autowiredをつける。

②変数にインジェクションできるインスタンスがDIコンポーネントに存在しない
[発生する例外]NullPointerExceptionの上にBeanCreationExceptionが発生
[対処]大抵はインジェクションする側に@Componentのつけ忘れ

③変数にインジェクションできるインスタンスが2つ以上DIコンポーネントにある
[発生する例外]NullPointerExceptionの上にBeanCreationExceptionが発生
[対処]インジェクション先の変数に対して、インジェクションできるインスタンスが2個以上ある。
@Primaryをつけるなどしてインスタンスごとの優先順位をつける。

また、DIを前提としているところでnewでインスタンスを作成してもよいのか、という点ですが、
①テストしない
②納品後のメンテナンスや機能追加など知ったことではない
という条件が揃えばnewしても問題ないと思います。そんなプロダクトはめったに無いですし、私がそんなプロダクトの保守を任されたらその日のうちに退職届を提出すると思いますが。。。

設定ファイル周りの取り回しが難しいのであれば、チームのエキスパート開発者に設定ファイル管理を一任してしまい、「エキスパート開発者以外は設定ファイルを触ってはならない。一般開発者はアプリケーションコード内での@Autowiredによる呼び出しのみ可能」という開発フローを採用するのも手段の一つです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

"DIコンテナにインスタンスの生成やライフサイクルを任せる規約を利用する"の面で、DIコンテナを使う意味があるのではないかと個人的には思います。

特に規約に縛られることなくインスタンスを作りたいのであればDIコンテナを使う理由はなくなってしまいます。
Springであればアスペクトの注入も可能ですので、インスタンスの実行前処理・後処理もSpringに任せるといったこともできますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.71%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る