Spring Boot部署AWS Elastic Beanstalk后邮件模板路径缺失问题求助
我开发了一款支持用户注册并发送验证邮件的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

