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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

Q&A

解決済

1回答

4937閲覧

オートワイヤリングできるクラスとできないクラスの違いはなんですか?

yuki1111

総合スコア72

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

0グッド

0クリップ

投稿2019/12/08 08:07

Spring bootで作ったWEBアプリケーションを起動しようとすると、下記のログが表示されます。
SendMailUtilsクラスのSimpleMailMessage型のフィールドに「@Autowired」をつけているからだと思います。
しかし、MailSender は大丈夫なのにSimpleSimpleMailMessageはなぜ駄目なのか気になりました。
なぜ駄目なのでしょうか?

↓でもSimpleSimpleMailMessageはオートワイヤリングしていません。
https://www.early2home.com/blog/programming/spring/post-972.html

log

12019-12-08 16:35:00.010 INFO 2016 --- [ main] ConditionEvaluationReportLoggingListener : 2 3Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 42019-12-08 16:35:00.167 ERROR 2016 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : 5 6*************************** 7APPLICATION FAILED TO START 8*************************** 9 10Description: 11 12Field msg in com.koikeya.project1.app.util.SendMailUtils required a bean of type 'org.springframework.mail.SimpleMailMessage' that could not be found. 13 14The injection point has the following annotations: 15 - @org.springframework.beans.factory.annotation.Autowired(required=true) 16 17 18Action: 19 20Consider defining a bean of type 'org.springframework.mail.SimpleMailMessage' in your configuration. 21

Java

1package com.koikeya.project1.app.util; 2 3import javax.annotation.PostConstruct; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.mail.MailSender; 7import org.springframework.mail.SimpleMailMessage; 8import org.springframework.stereotype.Component; 9 10import com.koikeya.project1.domain.model.MailForm; 11 12/** 13 * メール送信ユーティリティクラス 14 * 15 * @author user 16 * 17 */ 18@Component 19public class SendMailUtils { 20 21 /** 22 * 静的MailSender 23 */ 24 static MailSender staticMailSender; 25 26 /** 27 * 静的SimpleMailMessage 28 */ 29 static SimpleMailMessage staticMsg; 30 31 /** 32 * MailSender 33 */ 34 @Autowired(required = true) 35 private MailSender mailSender; 36 37 /** 38 * SimpleMailMessage 39 */ 40 @Autowired 41 private SimpleMailMessage msg; 42 43 44 /** 45 * 静的MailSenderを初期化する 46 */ 47 @PostConstruct 48 private void initialize() { 49 SendMailUtils.staticMailSender = mailSender; 50 SendMailUtils.staticMsg = msg; 51 } 52 53 /** 54 * コンストラクタ 55 */ 56 protected SendMailUtils() { 57 super(); 58 } 59 60 /** 61 * メールを送信する 62 * 63 * @param mailForm メールフォームオブジェクト 64 */ 65 public static void send(MailForm mailForm) { 66 SimpleMailMessage msg = new SimpleMailMessage(); 67 msg.setFrom("〇〇〇〇@gmail.com"); 68 msg.setTo(mailForm.getMail()); // 管理者アドレス 69 msg.setSubject("project1 アカウント確認のお願い"); 70 msg.setText(makeContent(mailForm)); 71 staticMailSender.send(msg); 72 } 73 74 /** 75 * コンテンツを編集する 76 * 77 * @param mailForm メールフォーム 78 * @return メールフォームの内容 79 */ 80 private static String makeContent(MailForm mailForm){ 81 return mailForm.getName() + "さん\n\n" + 82 "以下のリンクにアクセスしてアカウントを認証してください" + "\n" + 83 "問い合わせ内容: " + mailForm.getContent(); 84 } 85} 86

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

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

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

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

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

guest

回答1

0

ベストアンサー

MailSender は大丈夫なのにSimpleSimpleMailMessageはなぜ駄目なのか気になりました

インスタンスがDIコンテナで管理されているかどうかです。
MailSenderがインジェクションできるのはSpring FrameworkのDIコンテナで管理されているためで、SimpleMailMessageは管理されていないということになります。

プログラマが実装するコントローラークラスやサービスクラスに@Controllerや@Serviceといったアノテーションを付与するとDIコンテナで管理されますが、既存のクラスをDIコンテナで管理するには、@Configurationアノテーションを付けたクラスで明示的にBean化する方法があります。

たとえば、下記のようなコンフィグレーションクラスを実装すればSimpleMailMessageのインスタンスはDIコンテナで管理されるのでインジェクションされるとおもいます。

しかし送信するメッセージの内容が送信毎に変わるのであれば、このような実装は意味がありません。(送信するメッセージが固定化されるのであればあながち無意味ではないかもしれませんが)
なので、デフォルトでSimpleMailMessageはDIコンテナで管理されない(する必要がないので)のだと思います。

java

1@Configuration 2public class MailMessageConfigure { 3 4 @Bean 5 public SimpleMailMessage simpleMailMessage() { 6 SimpleMailMessage msg = new SimpleMailMessage(); 7 8 // msgの初期化処理 9 msg.setFrom("〇〇〇〇@gmail.com"); 10 msg.setTo("△△△△@gmail.com"); 11 msg.setSubject("件名"); 12 msg.setText("メール本文"); 13 14 return msg; 15 } 16 17}

なおSendMailUtilsをComponent化するのなら、このクラスのインスタンスはシングルトンになるので、staticメソッドを使うまでもなく、下記のように実装できます。

Java

1@Component 2public class SendMailUtils { 3 4 /** 5 * MailSender 6 */ 7 @Autowired(required = true) 8 private MailSender mailSender; 9 10 /** 11 * メールを送信する 12 * 13 * @param mailForm メールフォームオブジェクト 14 */ 15 public void send(MailForm mailForm) { 16 SimpleMailMessage msg = new SimpleMailMessage(); 17 msg.setFrom("〇〇〇〇@gmail.com"); 18 msg.setTo(mailForm.getMail()); // 管理者アドレス 19 msg.setSubject("project1 アカウント確認のお願い"); 20 msg.setText(makeContent(mailForm)); 21 mailSender.send(msg); 22 } 23 24 /** 25 * コンテンツを編集する 26 * 27 * @param mailForm メールフォーム 28 * @return メールフォームの内容 29 */ 30 private String makeContent(MailForm mailForm){ 31 return mailForm.getName() + "さん\n\n" + 32 "以下のリンクにアクセスしてアカウントを認証してください" + "\n" + 33 "問い合わせ内容: " + mailForm.getContent(); 34 } 35}

下記はSendMailUtilsを使う側の実装イメージです。DIコンテナ管理されているインスタンスをインジェクションするには、そのクラス自体がDIコンテナで管理されている必要があります。

Java

1@Service 2public class HogeService { 3 4 private final SendMailUtils sendMailUtils; 5 6 public HogeService(SendMailUtils sendMailUtils) { 7 this.sendMailUtils = sendMailUtils; 8 } 9 10 public void hogeSendMail() { 11 12 MailForm mailForm = /* mailForm を作成する処理 */ 13 14 sendMailUtils.send(mailForm); 15 16 } 17 18}

ちなみに、MailSenderはインターフェースなので実際にインジェクションされるインスタンスは、このインターフェースを実装したクラスになります。

投稿2019/12/08 09:19

rubytomato

総合スコア1752

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

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

yuki1111

2019/12/08 09:55

すごくわかりやすいです。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問