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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

571閲覧

Spring bootのDIに関して、privateメソッドからはDIされないのでしょうか?

rei_rrrrr

総合スコア2

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2022/09/12 08:30

編集2022/09/13 07:49

聞きたいこと

Spring bootのDIに関して、privateメソッドから呼び出す際の仕様について

発生している問題・エラーメッセージ

privateメソッドからサービスクラスをDIしようとすると、「NullPointerException」が発生してしまいました。 こちらのメソッド自体は、privateですが、DI元のクラスとメソッドはpublicになっております。 publicメソッドからDIをすれば問題なくDIされることを確認済ですが、privateメソッドからDIができない理由等、ご教示いただけますと幸いです。

該当のソースコード

java

1@Controller 2public class TestController { 3@Autowired 4TestService testService; ←このDIがリクエストを受けた際にnullになります。 5・・・・ 6} 7 8@RequestMapping(value = "/register_test1")  9public String fileTest1(Model model) { 10・・・・ 11testService.setTest("");  ←こちらのpublicメソッドからはDIができました 12return "test1"; 13} 14 15@RequestMapping(value = "/register_test2") 16private String fileTest2(Model model) { 17・・・・ 18testService.setTest("");  ←こちらのprivateメソッドからはDIができませんでした 19return "test2"; 20} 21

サービスクラス

java

1@Service 2public class TestService { 3 public Object setTest() { 4 ・・・・ 5 return object; 6 } 7} 8

試したこと

・該当サービスクラスをnewしていないかどうか
・mavenクリーン、プロジェクトの更新

似たような質問者様の回答

以下に、privateメソッドを試験する際に、DIが実施されず、NullPointExceptionが発生した旨の記述がありました。(根本的な理由は記載されていないようでした。。)

このような原因がわからず、理由が知りたく質問させていただきました。
ご回答いただけますと幸いです。

https://teratail.com/questions/123978

★9/13ソースコードの追記

■サーバー側の処理

java

1package com.test.batch.controller; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.io.UnsupportedEncodingException; 7 8import org.springframework.beans.factory.annotation.Autowired; 9import org.springframework.stereotype.Controller; 10import org.springframework.transaction.annotation.Transactional; 11import org.springframework.ui.Model; 12import org.springframework.web.bind.annotation.RequestMapping; 13import org.springframework.web.bind.annotation.RequestParam; 14import org.springframework.web.multipart.MultipartFile; 15 16import com.test.batch.repository.TestDataCsvManualRepository; 17import com.test.batch.repository.TestDataCsvimportRepository; 18import com.test.batch.service.TestDataCsvConvertService; 19import com.test.batch.utils.TestConst; 20 21@Controller 22public class TestController { 23 24@Autowired 25TestDataCsvManualRepository testDataCsvManualRepository; 26@Autowired 27TestDataCsvimportRepository testDataCsvimportRepository; 28@Autowired 29TestDataCsvConvertService testDataCsvConvertService; 30 31 /** テストデータ select **/ 32 @RequestMapping(value = "/check_test_data"") 33 public String testDataCountCheck( 34 @RequestParam(name = "torikomiDate") String torikomiDate, Model model) { 35 Integer checkCnt = null; 36 String resultMessage = null; 37 38 checkCnt = testDataCsvManualRepository.getByNouhin(torikomiDate); 39 if (checkCnt > 0) { 40 resultMessage = "【" + checkCnt + "】件のテストデータが存在します。"; 41 } else { 42 resultMessage = "テストデータが存在しません。"; 43 } 44 45 // 納品データ確認結果の設定 46 model.addAttribute("resultMessage1", resultMessage); 47 return "test_top"; 48 } 49 50 /** テストデータ delete **/ 51 @RequestMapping(value = "/delete_test_data") 52 @Transactional 53 public String deleteTest(@RequestParam(name = "torikomiDate") String torikomiDate, Model model) { 54 55 Integer successCnt = null; 56 String resultMessage = null; 57 58 successCnt = testDataCsvManualRepository.deleteByNouhin(torikomiDate); 59 if (successCnt > 0) { 60 resultMessage = "【" + successCnt + "】件のテストデータ削除が完了しました。"; 61 } else { 62 resultMessage = "削除対象のデータはありませんでした。"; 63 } 64 // 納品データ確認結果の設定 65 model.addAttribute("resultMessage5", resultMessage); 66 67 return "test_top"; 68 } 69 70 71 /** 納品データ 72 *・ ローカルからcsvファイルを取得し、DBへinsert 73 * @throws IOException 74 * */ 75 @RequestMapping(value = "/register_csv_data") 76 private String fileTest(@RequestParam("file") MultipartFile multipartFile, Model model) { 77 String currentContent = null; 78 String[] arrayColumnName = null; 79 String splitType = ","; 80 boolean isFirst = true; 81 Object arrayConvert = null; 82 Integer successCnt = 0; 83 String fileName = multipartFile.getOriginalFilename(); //ファイル名取得 84 String resultMessage = null; 85 86 //読込んだファイルを"Shift-JIS"文字規格で格納 87 try (BufferedReader br = new BufferedReader(new InputStreamReader(multipartFile.getInputStream(), "MS932"))) { 88 89 //csvファイルのデータが存在するまで繰り返し処理 90 while ((currentContent = br.readLine()) != null) { 91 //ヘッダー部分をスキップ ※取込むcsvファイルにカラム名のヘッダーが付加されていることが前提 92 if (isFirst) { 93 isFirst = false; 94 continue; 95 } 96 // "," 区切りで列の値を配列で取得 97 arrayColumnName = currentContent.split(splitType); 98 99 //arrayColumnName(配列)をクラス型に変換し、インサートを実行 100 switch (fileName) { 101 case TestConst.NOUHIN_JA_SIMPLE: //テストデータ1 102 arrayConvert = testDataCsvConvertService.setConvertType(arrayColumnName,testConst.HANMOTO, fileName, "1");←ここでtestDataCsvConvertServiceがnullになっておりました 103 successCnt += testDataCsvimportRepository.insertNouhin(arrayConvert); 104 resultMessage = "【" + successCnt + "】件のテストデータ1のinsertが完了しました。"; 105 model.addAttribute("resultMessage9", resultMessage); 106 break; 107 case TestConst.HENPIN_JA_SIMPLE: //テストデータ2 108 arrayConvert = testDataCsvConvertService.setConvertType(arrayColumnName,TestConst.HANMOTO, fileName, "2"); 109 successCnt += testDataCsvimportRepository.insertNouhin(arrayConvert); 110 resultMessage = "【" + successCnt + "】件のテストデータ2のinsertが完了しました。"; 111 model.addAttribute("resultMessage10", resultMessage); 112 break; 113 } 114 } 115 116 } catch (UnsupportedEncodingException e) { 117 e.printStackTrace(); 118 } catch (IOException e) { 119 e.printStackTrace(); 120 } 121 return "test_top"; 122 } 123} 124

■画面側の処理

html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3 4<head> 5 <meta charset="utf-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 <title>手動取込実行</title> 8 <link rel="stylesheet" href="css/common.css" /> 9 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" 10 integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> 11 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/notyf@3/notyf.min.css"> 12 <script src="https://cdn.jsdelivr.net/npm/notyf@3/notyf.min.js"></script> 13</head> 14 15<body> 16 <div class="jumbotron"> 17 18 <div class="container"> 19 <h4>バッチ処理手動実行画面 <button id="unlock_button" type="button" class="btn btn-outline-danger">ロック解除</button></h4> 20 </div> 21 22 <div class="container mt-3"> 23 24 <div class="container mt-3"> 25 <div class="alert alert-success" role="alert"> 26 <h5 class="alert-heading">1. テストデータ</h5> 27 <hr> 28 <div class="d-flex mb-3"> 29 <h5 class="alert-heading mr-4">・データ確認</h5> 30 <label class="mr-2" style="font-size:15px">バッチ取込日</label> 31 <form method="post" action="/check_test_data"> 32 <div> 33 <input type="date" name="torikomiDate" class="text_date mr-2"> 34 <button type="submit" class="btn btn-success submit-btn" disabled> 実行 </button> 35 </div> 36 </form> 37 <p class="ml-2" style="font-size:15px;color:#de3e3e; background:#20c93b4f;" th:text="${resultMessage1}"></p> 38 </div> 39 <div class="d-flex mb-3"> 40 <h5 class="alert-heading mr-4">・データ削除</h5> 41 <label class="mr-2" style="font-size:15px">バッチ取込日</label> 42 <form method="post" action="/delete_test_data"> 43 <div> 44 <input type="date" name="torikomiDate" class="text_date mr-2"> 45 <button type="submit" class="btn btn-success submit-btn" disabled> 実行 </button> 46 </div> 47 </form> 48 <p class="ml-2" style="font-size:15px;color:#de3e3e; background:#20c93b4f;" th:text="${resultMessage5}"></p> 49 </div> 50 <div class="d-flex"> 51 <h5 class="alert-heading mr-4">・データ登録</h5> 52 <label class="mr-2" style="font-size:15px">バッチ取込日</label> 53 <form method="post" action="/register_csv_data" enctype="multipart/form-data"> 54 <div> 55 <input type="file" name="file" accept=".csv"> 56 <!-- <input type="date" name="torikomiDate" class="text_date mr-2"> --> 57 <button type="submit" class="btn btn-success submit-btn" disabled> 実行 </button> 58 <p>※ファイル名を「テスト.CSV」に修正し、実行</p> 59 </div> 60 </form> 61 <p class="ml-2" style="font-size:15px;color:#de3e3e; background:#20c93b4f;" th:text="${resultMessage9}"></p> 62 </div> 63 </div> 64 </div> 65 </div> 66 67 <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" 68 integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" 69 crossorigin="anonymous"></script> 70 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" 71 integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" 72 crossorigin="anonymous"></script> 73 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" 74 integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" 75 crossorigin="anonymous"></script> 76 <script src="js/test_batch.js"></script> 77</body> 78 79</html>

バージョンに関して

<modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath /> <!-- lookup parent from repository --> </parent>

補足

・privateにしていたメソッドは、ファイルを受け取る処理がありますが、html上に記載していたfile処理と、サーバー側の@RequestParmを削除しても、@Autowiredしたクラスは、nullのままでDIできないようでしたので、リクエスト時のパラーメター等は問題ないと考えました
・各メソッドに関しても、サービスクラスをDIしている部分のみnullになってしまい、その他の処理は問題なく値等取れておりました

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/09/12 11:03

念のため、 ・・・・ がどうなっているのか例で良いので記載いただければと。 実際のコードが望ましいですが。 あと、念のためSpriing Bootのバージョンも提示してください。 ※pom.xmlからコピペしてください。
rei_rrrrr

2022/09/13 07:41

返信頂きありがとうございます。 デバック等試した結果、コードの方は問題なさそうでしたので、パラーメター等含めかなり簡略して掲載しておりました。上記にソースコードを追記いたしました。 「★9/13ソースコードの追記」から記載しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問