学習の一環として、eclipse2019.4.14、Java1.8、SpringBoot(2.0.4.RELEASE)、MySQL5.7によるwebアプリの開発を行っております。
現在メールを送る機能を実装するためにとりあえずフォームから入力されたメールアドレスに定型文を送る機能を作っています。
ネットの資料をあさりながら実験としてまっさらなプロジェクトにコードを書いてみるとメールの送信に成功しました。
しかし、本番用のプロジェクトにほぼ同じコードを書いてみるとエラーが起きてしまいました。
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. [2m2020-07-15 16:53:41.443[0;39m [31mERROR[0;39m [35m12876[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.s.b.d.LoggingFailureAnalysisReporter [0;39m [2m:[0;39m *************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in com.example.demo.service.MailService required a bean of type 'org.springframework.mail.MailSender' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'org.springframework.mail.MailSender' in your configuration.
エラーコードを読むとbeanの登録関係でのエラーのようですが、テストプロジェクトとの違いがわからず原因がはっきりしません。
パッケージの構成の違いでもDI関係のエラーが出ることがあるのでしょうか?
テストプロジェクトでのコード
・コントロールクラス
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import com.example.demo.DemoApplication; @Controller public class MailController { @Autowired DemoApplication demo; @GetMapping("/mail") public String getCheckPasswordSending() { //adminWorkSchedule.htmlへ遷移 return "/mailForm"; } @PostMapping("/passwordSending") public String postPasswordSending(@RequestParam("mailaddres")String mailaddres, Model model ) { //パスワードとアドレスをメール送信メソッドに渡す demo.run(mailaddres); return "hello"; } }
・メール送信処理をするサービスクラス
package com.example.demo; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Service; @Service public class DemoApplication { private final MailSender mailSender; public DemoApplication(MailSender mailSender) { this.mailSender = mailSender; } public void run(String str) { SimpleMailMessage msg = new SimpleMailMessage(); msg.setTo(str); msg.setCc(str); msg.setBcc(str); msg.setSubject("件名"); msg.setText("本文"); // メール送信 mailSender.send(msg); System.out.println(str); } }
・メールフォームのHTML
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <!-- Bootstrapの設定 --> <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel = "stylesheet"></link> <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script> <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> <title>パスワード送信画面</title> </head> <body class="text-center"> <h1>パスワードを送信します</h1> <br/> <h2>登録しているメールアドレスを入力してください</h2> <div style="text-align:center"> <form method="post" action="/passwordSending"> <div class="form-group"> <input type="text" name="mailaddres" th:value="${mailadddres_value}"> </div> <button class="btn btn-primary" type="submit" style="padding:10px;"><font size="7">送信</font></button> </form> <br/> </div> </body> </html>
本番用のプロジェクトでのコード
・コントールクラス
package com.example.demo.login.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import com.example.demo.model.Employee; import com.example.demo.service.EmployeeService; import com.example.demo.service.MailService; @Controller public class MailController { @Autowired EmployeeService employeeService; @Autowired MailService mailService; //パスワード送信処理 @PostMapping("/passwordSending") public String postPasswordSending(@RequestParam("mailaddres")String mailaddres, Model model ) { //データベースからパスワードを受け取る Employee employee = employeeService.selectPassword(mailaddres); //Modelに登録 model.addAttribute("password", employee.getPassword()); //パスワードとアドレスをメール送信メソッドに渡す mailService.addresget(mailaddres, employee.getPassword()); //adminWorkSchedule.htmlへ遷移 return "login/checkPasswordSending"; } @GetMapping("/passwordSending") public String getCheckPasswordSending() { //adminWorkSchedule.htmlへ遷移 return "login/passwordSending"; } }
・メール送信処理があるサービスクラス
package com.example.demo.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Service; @Service public class MailService { private final MailSender mailSender; public MailService(MailSender mailSender) { this.mailSender = mailSender; } //メール送信メソッド public void addresget(String add,String pass ) { SimpleMailMessage msg = new SimpleMailMessage(); msg.setTo(add); msg.setSubject("件名"); msg.setText(pass); // メール送信 mailSender.send(msg); } }
・入力ホームのHTMLはテストと同じ
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。