不同文件夹下的OTP控制器如何调用SendMail服务并传入OTP值
问题
需求为在OTP相关REST接口中调用SendMail服务,现有两个分属不同文件夹的Controller代码如下:
OTP Controller代码
@PostMapping(value = "/createOtp") public ResponseEntity<ResponseDto<OTPDto>> createOtp(@Valid @RequestBody OTPDto otpDto, String username) { //throws Exception log.info("INIZIO getOTP - registerUserDto: {}", otpDto); OTPDto response = otpFacade.createOTP(otpDto,username); log.info("FINE getOTP - response: {}", response); return ResponseEntity.ok(ResponseDto.<OTPDto>builder().noinfo(response).build()); }
邮件Controller代码
@PostMapping(value = "/sendMailNoAttachment") public String sendMailNoAttachment(@RequestBody MailObj mailObj) throws IOException { log.info("INIZIO sendMailNoAttachment"); emailService.sendSimpleMessage(mailObj.getEmailAddress(), mailObj.getSubject(), mailObj.getText()); log.info("FINE sendMailNoAttachment"); return "Your mail has been send to the user."; }
请问应如何在createOtp方法中调用邮件发送逻辑,并将生成的OTP值传入邮件内容中?注:无法提供完整的控制器代码。
解决方案
不建议直接调用另一个Controller的方法(Controller的核心职责是处理HTTP请求,内部业务逻辑调用应依赖服务层),更合理的实现方式如下:
方案一:直接依赖邮件服务层(推荐)
利用Spring的依赖注入,在OTP Controller中引入邮件服务,直接调用发送逻辑:
注入邮件服务到OTP Controller
在OTP Controller类中添加邮件服务的注入:@Autowired private EmailService emailService; // 类名需和邮件Controller中使用的保持一致生成OTP后发送邮件
在createOtp方法中,获取生成的OTP值,构造邮件参数并调用服务:@PostMapping(value = "/createOtp") public ResponseEntity<ResponseDto<OTPDto>> createOtp(@Valid @RequestBody OTPDto otpDto, String username) throws IOException { log.info("INIZIO getOTP - registerUserDto: {}", otpDto); OTPDto response = otpFacade.createOTP(otpDto,username); log.info("FINE getOTP - response: {}", response); // 构造邮件内容(根据实际业务调整字段,比如从otpDto或response中取收件邮箱) String emailAddress = otpDto.getEmail(); // 替换为实际的邮箱字段名 String subject = "你的OTP验证码"; String text = String.format("你的验证码是:%s,请在有效时间内使用", response.getOtp()); // 假设OTPDto有getOtp()方法 // 调用邮件服务发送 emailService.sendSimpleMessage(emailAddress, subject, text); log.info("OTP邮件已发送至:{}", emailAddress); return ResponseEntity.ok(ResponseDto.<OTPDto>builder().noinfo(response).build()); }
方案二:调用邮件Controller的HTTP接口(不推荐)
如果因限制必须通过HTTP请求调用邮件接口,可使用RestTemplate发起请求:
注入RestTemplate
@Autowired private RestTemplate restTemplate;构造请求参数并调用接口
@PostMapping(value = "/createOtp") public ResponseEntity<ResponseDto<OTPDto>> createOtp(@Valid @RequestBody OTPDto otpDto, String username) throws IOException { log.info("INIZIO getOTP - registerUserDto: {}", otpDto); OTPDto response = otpFacade.createOTP(otpDto,username); log.info("FINE getOTP - response: {}", response); // 构造MailObj参数 MailObj mailObj = new MailObj(); mailObj.setEmailAddress(otpDto.getEmail()); mailObj.setSubject("你的OTP验证码"); mailObj.setText(String.format("你的验证码是:%s", response.getOtp())); // 调用邮件接口(替换为实际的接口地址,包括服务地址、端口、上下文路径) String mailApiUrl = "http://your-mail-service-host:port/context-path/sendMailNoAttachment"; String result = restTemplate.postForObject(mailApiUrl, mailObj, String.class); log.info("邮件接口调用结果:{}", result); return ResponseEntity.ok(ResponseDto.<OTPDto>builder().noinfo(response).build()); }
注意事项:
- 确保
EmailService、MailObj在OTP Controller所在模块中可访问(跨模块需引入对应依赖) - 代码中的字段名(如
otpDto.getEmail())需匹配实际业务的实体类定义 - 可根据需求添加异常处理逻辑,比如捕获邮件发送失败的异常并做相应处理
内容的提问来源于stack exchange,提问作者Roberto Rulli
相关产品推荐
相关产品推荐

