Quarkus测试模式下Qute模板与Mailer内嵌图片找不到文件问题求助
Quarkus测试时邮件内联图片找不到问题解决
问题描述
图片存放于META-INF/resources/images/apoio_logo.png路径,Quarkus服务运行时可正常加载图片并发送邮件,但执行mvn test时抛出java.nio.file.NoSuchFileException,提示找不到/home/fabio/Documents/REMSoft/apoio-notificacao/images/apoio_cotacoes.png文件。
相关代码
public Uni<Void> enviarNotificacaoMQ(Email email) { String body = engine.getTemplate(email.getTemplate()).data("email", email).render(); Log.info("***** preparando para enviar e-mail AWS *****"); Mail mail = prepararEmail(email, body); Uni<Void> enviado = reactiveMailer.send(mail); Log.info("***** email enviado com sucesso *****"); return enviado; } private Mail prepararEmail(Email email, String body) { Mail mail = new Mail(); List<String> to = new ArrayList<>(); List<String> cc = new ArrayList<>(); to.add(email.getEmail()); cc.add(email.getEmailCC()); mail.setTo(to); Optional.of(cc).ifPresent(mail::setBcc); Optional.of(email.getEmailsCCO()).ifPresent(mail::setBcc); mail.setSubject(email.getAssunto()); mail.setHtml(body); mail.addInlineAttachment("apoio_cotacoes.png", new File("images/apoio_cotacoes.png"), "image/png", "<apoio_logo>"); return mail; }
邮件模板
<div style="text-align: center"> <img src="cid:apoio_logo"> </div>
解决办法
问题核心:运行服务时Quarkus会自动映射META-INF/resources下的资源,相对路径可正常解析;但测试时当前工作目录为项目根目录,资源实际编译后存放在target/classes/META-INF/resources/images/下,直接用File读取相对路径会定位失败。
推荐以下两种解决方案:
使用类加载器读取资源流(推荐)
替换原代码中new File()的方式,通过类加载器获取资源输入流,适配所有环境:// 获取资源输入流 InputStream imageStream = getClass().getClassLoader().getResourceAsStream("images/apoio_cotacoes.png"); // 调用重载方法添加内联附件 mail.addInlineAttachment("apoio_cotacoes.png", imageStream, "image/png", "<apoio_logo>");注:邮件客户端会自动关闭输入流,无需手动处理。
指定编译后资源路径(不推荐)
若坚持使用File类,可直接指定测试环境下的资源路径,但该方式耦合本地环境,通用性差:String imagePath = "target/classes/META-INF/resources/images/apoio_cotacoes.png"; mail.addInlineAttachment("apoio_cotacoes.png", new File(imagePath), "image/png", "<apoio_logo>");
内容的提问来源于stack exchange,提问作者Fábio Gonçalves
相关产品推荐
相关产品推荐

