You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同文件夹下的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中引入邮件服务,直接调用发送逻辑:

  1. 注入邮件服务到OTP Controller
    在OTP Controller类中添加邮件服务的注入:

    @Autowired
    private EmailService emailService; // 类名需和邮件Controller中使用的保持一致
    
  2. 生成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发起请求:

  1. 注入RestTemplate

    @Autowired
    private RestTemplate restTemplate;
    
  2. 构造请求参数并调用接口

    @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:25:23