首页 > 解决方案 > 我无法通过 Postman 测试我的 Spring Boot 邮件发件人 API

问题描述

我无法通过 Postman 测试我的 Spring Boot 邮件发件人 API。我想用spring boot创建一个api并发送邮件。为此,我在下面分享了应用程序属性、服务和控制器类。但是,当我通过邮递员提供 url 并将 json 正文添加到 post 方法时,我得到一个错误。我该如何解决?

邮递员回应

{
    "timestamp": "2020-10-29T15:26:23.300+00:00",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/mail/send"
}

邮递员测试参数

url: http://localhost:8080/mail/send
method: post
JSON body: 

{
 "to" : "mail@gmail.com",
 "textBody" : "TEST",
 "topic" : "TEST"
}

应用程序属性

spring.mail.default-encoding=UTF-8
spring.mail.host=smtp.gmail.com
spring.mail.username=mail@gmail.com
spring.mail.password=password
spring.mail.port=587
spring.mail.protocol=smtp
spring.mail.test-connection=false
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

服务等级

@Service
public class SendEmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendEmail(String to, String body, String topic){
        try {
            System.out.println("Mail sending is started");
            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
            simpleMailMessage.setFrom("mutlueren01@gmail.com");
            simpleMailMessage.setTo(to);
            simpleMailMessage.setSubject(topic);
            simpleMailMessage.setText(body);
            javaMailSender.send(simpleMailMessage);
            System.out.println("Mail sending is completed");
        }catch (Exception e){
            System.out.println("Error occured: "+e.getMessage());
        }
    }
}

控制器

@Controller
public class SendEmailController {

    @Autowired
    SendEmailService sendEmailService;

    @RequestMapping(value = "/mail/send/", method = RequestMethod.POST)
    public void sendMail(@RequestParam("to") String to, @RequestParam("textBody") String textBody, @RequestParam("topic") String topic) {
        sendEmailService.sendEmail(to, textBody, topic);
    }

}

标签: javaspringspring-bootspring-mvc

解决方案


问题出在控制器中。您正在发送请求正文(json),但正在尝试处理请求参数。阅读差异。

我会建议创建一个类:

public class EmailSendingRequest {
String to;
String textBody;
String topic;
//... getters, setters
}

并更改您的控制器方法如下:

    @RequestMapping(value = "/mail/send", method = RequestMethod.POST)
    public void sendMail(@RequestBody EmailSendingRequest emailSendingRequest) {
        sendEmailService.sendEmail(emailSendingRequest.getTo(), 
emailSendingRequest.getTextBody(), emailSendingRequest.getTopic());
    }

PS 或者您可以使用请求参数发送请求并且不更改任何内容 - 查询http://localhost:8080/mail/send?to=mail@gmail.com&textBody=TEST&topic=TEST,但我不确定这是否是个好主意。


推荐阅读