Comment utiliser SpringTemplateEngine lors de l'utilisation de Spring Boot


rcorrhée:

J'utilise Thymeleaf SpringTemplateEngine pour créer un e-mail HTML sur mon application Spring. Quand j'utilisais Pure Spring MVC, tout était parfait. Maintenant, avec Spring Boot, la classe ne peut pas trouver mon modèle .html. Je pense que le problème est avec ServletContext qui ne renvoie pas le bon chemin, mais je ne peux pas comprendre comment le résoudre. Dois-je donc utiliser un autre contexte pour traiter le modèle? Laquelle?

C'est mon MailService qui travaille pour Pure Spring MVC.

@Service
public class MailService {

    private JavaMailSenderImpl mailSender;

    private SpringTemplateEngine templateEngine;

    public MailService() {
        mailSender = new JavaMailSenderImpl();
        //mailSender config

        templateEngine = new SpringTemplateEngine();
        Set<ITemplateResolver> templatesResolvers = new HashSet<ITemplateResolver>();

        ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
        emailTemplateResolver.setPrefix("mail/");
        emailTemplateResolver.setTemplateMode("HTML5");
        emailTemplateResolver.setCharacterEncoding("UTF-8");
        emailTemplateResolver.setOrder(1);
        templatesResolvers.add(emailTemplateResolver);

        ServletContextTemplateResolver webTemplateResolver = new ServletContextTemplateResolver();
        webTemplateResolver.setPrefix("/mail/");
        webTemplateResolver.setTemplateMode("HTML5");
        webTemplateResolver.setCharacterEncoding("UTF-8");
        webTemplateResolver.setOrder(2);
        templatesResolvers.add(webTemplateResolver);

        templateEngine.setTemplateResolvers(templatesResolvers);
    }

    public void sendReport(String nome, String email, String obra,
            long medicao, HttpServletRequest request,
            HttpServletResponse response, ServletContext context, Locale locale)
            throws MessagingException {

        String subject = "Novo relatório";

        final WebContext ctx = new WebContext(request, response, context,
                locale);
        ctx.setVariable("nome", nome);
        ctx.setVariable("obra", obra);
        ctx.setVariable("data", DataUtils.getInstance().getDataString(medicao));
        ctx.setVariable("logo", "logo.jpg");

        final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
        final MimeMessageHelper message = new MimeMessageHelper(mimeMessage,
                true, "UTF-8");
        message.setSubject(subject);
        try {
            message.setFrom(new InternetAddress(mailSender.getUsername(),
                    "Sistema"));
        } catch (UnsupportedEncodingException e) {
        }
        message.setTo(email);

        final String htmlContent = this.templateEngine.process(
                "email-relatorio.html", ctx);
        message.setText(htmlContent, true);

        try {
            File file = new File(context.getRealPath("app/img/logo-pro.jpg"));
            InputStreamSource imageSource = new ByteArrayResource(
                    IOUtils.toByteArray(new FileInputStream(file)));
            message.addInline("logo.jpg", imageSource, "image/jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }

        this.mailSender.send(mimeMessage);
    }
}

L'erreur:

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "email-relatorio.html", template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:246)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:924)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:898)
Marcus alors:

Vous utilisez Spring Boot, puis laissez Spring Boot faire le gros du travail, ce qu'il fait déjà. Supprimez votre constructeur et simplement @Autowirele JavaMailSenderet SpringTemplateEngine.

Ajoutez la configuration de messagerie dans le application.properties.

spring.mail.host=your-mail-server
spring.mail.port=
spring.mail.username
spring.mail.password

Ajoutez la configuration de feuille de thym à l'application.properties

# THYMELEAF (ThymeleafAutoConfiguration)
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.excluded-view-names= # comma-separated list of view names   that should be excluded from resolution
spring.thymeleaf.view-names= # comma-separated list of view names that can be resolved
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html # ;charset=<encoding> is added
spring.thymeleaf.cache=true # set to false for hot refresh

Si vous l'avez fait, changez de classe

@Service
public class MailService {

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private SpringTemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String username;

    public void enviarRelatorio(String nome, String email, String obra,long medicao, Locale locale) throws MessagingException {

        String subject = "Novo relatório";

        final Context ctx = new Context(locale);
        ctx.setVariable("nome", nome);
        ctx.setVariable("obra", obra);
        ctx.setVariable("data", DataUtils.getInstance().getDataString(medicao));
        ctx.setVariable("logo", "logo.jpg");

        final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
        final MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true, "UTF-8");
        message.setSubject(subject);
        message.setTo(email);

        try {
            message.setFrom(new InternetAddress(username, "Sistema"));
        } catch (UnsupportedEncodingException e) {
        }

        final String htmlContent = this.templateEngine.process( "email-relatorio", ctx);
        message.setText(htmlContent, true);

        try {
            message.addInline("logo.jpg", new FileSystemResource("imgs/logo-pro.jpg"), "image/jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }

        this.mailSender.send(mimeMessage);
    }
}

Articles connexes


Comment persister lors de l'utilisation de Spring Boot avec JPA

Jan Vladimir Mostert J'ai l'habitude d'utiliser Spring Roo pour générer mes entités et de le faire gérer l'injection de entityManager ainsi que de persist et d'autres méthodes via les classes AspectJ. J'essaye maintenant d'utiliser Spring Boot pour faire quelq