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

Spring Boot部署AWS Elastic Beanstalk后邮件模板路径缺失问题求助

问题:AWS Elastic Beanstalk部署Spring Boot应用后邮件模板找不到

我开发了一款支持用户注册并发送验证邮件的Spring Boot应用,参照网络教程实现了AbstractEmailContext类,采用AWS Elastic Beanstalk进行应用部署。本地测试时数据库及邮件发送功能均正常,但部署到Elastic Beanstalk后,邮件发送报错,提示无法找到confirm.html模板。

相关代码

AccountVerificationEmailContext类

public class AccountVerificationEmailContext extends AbstractEmailContext{

    private String token;

    @Override
    public <T> void init(T context){
        CCUser ccUser = (CCUser) context;
        put("name", ccUser.getName());
        setTemplateLocation("/confirm");
        setSubject("Complete your registration!");
        setFrom("no_reply@crosscheck.tech");
        setTo(ccUser.getEmail());
    }

    @Override
    public <T> void rinit(T context){
        CCUser ccUser = (CCUser) context;
        put("email", ccUser.getEmail());
        setTemplateLocation("/creset");
        setSubject("Change your Password!");
        setFrom("no_reply@crosscheck.tech");
        setTo(ccUser.getEmail());
    }

    public void setToken(String token){
        this.token = token;
        put("token", token);
    }

    public void buildVerificationUrl(final String baseUrl, final String token){
        final String url = UriComponentsBuilder.fromHttpUrl(baseUrl).path("/registration/verify").queryParam("token",token).toUriString();
        put("verificationURL",url);
    }

    public void buildResetUrl(final String baseUrl, final String token){
        final String url = UriComponentsBuilder.fromHttpUrl(baseUrl).path("/forgotpass/resetpass").queryParam("token",token).toUriString();
        put("verificationURL",url);
    }
}

邮件发送方法

@Override
public void sendRegistrationConfirmationEmail(CCUser user){
    ConfirmationToken secureToken = secureTokenService.createSecureToken();
    secureToken.setUserToken(user);
    secureTokenRepository.save(secureToken);
    AccountVerificationEmailContext emailContext = new AccountVerificationEmailContext();
    emailContext.init(user);
    emailContext.setToken(secureToken.getConfirmationToken());
    emailContext.buildVerificationUrl(baseUrl, secureToken.getConfirmationToken());
    try {
        emailService.sendMail(emailContext);
    } catch (MessagingException e) {
        e.printStackTrace();
    }

}

报错信息

Feb  4 22:18:25 ip-10-0-10-120 web[517963]: 2024-02-04T22:18:25.691Z ERROR 517963 --- [nio-5000-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateInputException: Error resolving template [src/resources/templates/confirm], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause
Feb  4 22:18:25 ip-10-0-10-120 web[517963]: org.thymeleaf.exceptions.TemplateInputException: Error resolving template [src/resources/templates/confirm], template might not exist or might not be accessible by any of the configured Template Resolvers

解决方案

  • 确认模板打包路径:Spring Boot默认会将src/main/resources/templates下的文件打包到jar包的BOOT-INF/classes/templates目录下。本地打包成jar后,解压检查该目录下是否存在confirm.html和creset.html,确保文件没有遗漏。

  • 修正模板路径处理逻辑:报错信息显示系统在查找src/resources/templates/confirm,说明AbstractEmailContext中可能对传入的路径拼接了错误的本地前缀。检查AbstractEmailContext中处理setTemplateLocation的逻辑,确保它基于classpath:/templates/拼接路径,而非硬编码本地文件系统的src/resources/前缀。

  • 检查Thymeleaf模板解析器配置:确保Spring Boot的Thymeleaf配置正确指向模板目录。如果使用自定义解析器,配置示例如下:

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("classpath:/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCharacterEncoding("UTF-8");
        return templateResolver;
    }
    

    保证解析器的prefix为classpath:/templates/,不要包含本地路径前缀。

  • 本地预测试jar包:部署到Elastic Beanstalk前,先在本地用java -jar your-app.jar启动应用,测试邮件发送功能,确认模板能正常加载,避免因打包问题导致部署后出错。

内容的提问来源于stack exchange,提问作者SERKAN AYDOGDU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:38:21