Как настроить конфигурацию так, чтобы Thymeleaf отображал мой HTML-шаблон - PullRequest
0 голосов
/ 25 января 2019

Это мой первый вопрос по стеку, поэтому я прошу прощения, если он не отформатирован правильно.

У меня есть приложение, которое отправляет электронное письмо с использованием шаблона HTML, когда отправка изменила статус.Механизм отправки работает как надо, и он находит мой шаблон просто отлично.Проблема в том, что отправленное письмо - это просто мой HTML в виде обычного текста, который вообще не отображается.Таким образом, вместо красиво отрисованной HTML-страницы, тело письма - просто код.

Я думаю, что проблема лежит где-то в файле конфигурации.У меня есть другое приложение, которое использует более старую версию Thymeleaf и работает именно так, как и должно, но, к сожалению, настройки для этого устарели и больше не работают.Кроме того, я попытался использовать несколько различных параметров конфигурации, как показано в закомментированной части моего кода.

Я проверил каждую строку шаблона HTML, чтобы убедиться в отсутствии незамкнутых тегов или символов, которые могли бы выйти из HTML.Все данные передаются из контроллера в шаблон, и я проверил, чтобы шаблон правильно отображался в браузере.Просто когда он собирает все вместе и отправляет электронное письмо, он не работает и не рендерится.

Я включил мой файл pom, соответствующую часть из app.config и сам app.config,Опять же, это мой первый вопрос здесь, поэтому, если я что-то упустил, я был бы рад добавить его, и если вопрос отформатирован неправильно, я извиняюсь и открыт для критики о том, как сделать это правильно.

Спасибо.

Приложение использует Spring Boot 2.1.1, Spring 5 и Thymeleaf 3.0.11.Я также пытался использовать Spring 4 и более ранние версии Thymeleaf.

pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.api</groupId>
<artifactId>tms-scheduled-tasks</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>tms-scheduled-tasks</name>
<description>TMS Scheduled Tasks</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.7.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf</artifactId>
        <version>3.0.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
    </dependency>
    <dependency>
        <groupId>nz.net.ultraq.thymeleaf</groupId>
        <artifactId>thymeleaf-layout-dialect</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

</project>

Из application.properties

# Thymeleaf
 spring.thymeleaf.mode=HTML
 spring.thymeleaf.cache=false

AppConfig

package com.api.tmsscheduledtasks.config;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import 
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import 
org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan("com.api")
public class AppConfig implements WebMvcConfigurer {

private ApplicationContext applicationContext;

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
            .addResourceLocations("classpath:/WEB-INF/resources/");
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}

/**
 * According to some resource I can no longer remember
 */
    @Bean
public SpringResourceTemplateResolver templateResolver() {
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setApplicationContext(this.applicationContext);
    templateResolver.setPrefix("classpath:/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML");

    return templateResolver;
}

@Bean
SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());

    return templateEngine;
}

@Bean
public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());

    return viewResolver;
}

/**
 * According to Baeldung
 */
//    @Bean
//    public ViewResolver htmlViewResolver() {
//        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
//        resolver.setTemplateEngine(templateEngine((templateResolver())));
//        resolver.setContentType("text/html");
//        resolver.setCharacterEncoding("UTF-8");
//        resolver.setViewNames(ArrayUtil.array("*.html"));
//
//        return resolver;
//    }
// 
//    private ISpringTemplateEngine templateEngine(ITemplateResolver 
templateResolver) {
//        SpringTemplateEngine engine = new SpringTemplateEngine();
//        engine.setTemplateResolver(templateResolver);
//        return engine;
//    }
//
//    private ITemplateResolver templateResolver() {
//        SpringResourceTemplateResolver templateResolver = new 
SpringResourceTemplateResolver();
//        templateResolver.setApplicationContext(applicationContext);
//        templateResolver.setPrefix("classpath:/templates/");
//        templateResolver.setSuffix(".html");
//        templateResolver.setCacheable(false);
//        templateResolver.setTemplateMode(TemplateMode.HTML);
//
//        return templateResolver;
//    }
    /**
     * According to thymeleaf.org
     */
//    public void setApplicationContext(ApplicationContext 
applicationContext) {
//        this.applicationContext = applicationContext;
//    }
//
//    @Bean
//    public ViewResolver viewResolver() {
//        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
//        resolver.setTemplateEngine(templateEngine());
//        resolver.setCharacterEncoding("UTF-8");
//        return resolver;
//    }
//
//    @Bean
//    public TemplateEngine templateEngine() {
//        SpringTemplateEngine engine = new SpringTemplateEngine();
//        engine.setEnableSpringELCompiler(true);
//        engine.setTemplateResolver(templateResolver());
//        return engine;
//    }
//
//    private ITemplateResolver templateResolver() {
//        SpringResourceTemplateResolver resolver = new 
SpringResourceTemplateResolver();
//        resolver.setApplicationContext(applicationContext);
//        resolver.setPrefix("/WEB-INF/templates/");
//        resolver.setTemplateMode(TemplateMode.HTML);
//        return resolver;
//    }
    /**
    * Old setup from other app
    */
//    @Bean
//    public TemplateResolver templateResolver() {
//        TemplateResolver templateResolver = new 
ClassLoaderTemplateResolver();
//        templateResolver.setSuffix(".html");
//        templateResolver.setTemplateMode("HTML");
//
//        return templateResolver;
//    }

EDIT

Поговорив с коллегой на работе, он обнаружил проблему.Оказывается, я пропустил класс Email, где все строилось.Это была довольно глупая ошибка с моей стороны, но я опубликую оригинальный код ниже, а затем ответ.

import org.springframework.mail.SimpleMailMessage;

public class Email {
private SimpleMailMessage message;

public Email setFrom(String from) {
    getMessage().setFrom(from);

    return this;
}

public Email setTo(String to) {
    getMessage().setTo(to);

    return this;
}

public Email setSubject(String subject) {
    getMessage().setSubject(subject);

    return this;
}

public Email setText(String text) {
    getMessage().setText(text);

    return this;
}

public SimpleMailMessage build() {
    return getMessage();
}

protected SimpleMailMessage getMessage() {
    if (message == null) {
        message = new SimpleMailMessage();
    }

    return this.message;
}
}

1 Ответ

0 голосов
/ 25 января 2019

Снова.Решение было очень простым, но я это то, что я пропустил в классе Email, я должен был удалить SimpleMailMessage и заменить его на MimeMessagePreparator. Ничего не было неправильно в конфигурации или что-то в этом роде.Только я упустил из виду старый метод с момента его установки и забыл изменить его.Вот изменение, которое было сделано.

import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;

public class Email {
    private String from;
    private String to;
    private String subject;
    private String text;

    public Email setFrom(String from) {
        this.from = from;

        return this;
    }

    public Email setTo(String to) {
        this.to = to;

        return this;
    }

    public Email setSubject(String subject) {
        this.subject = subject;

        return this;
    }

    public Email setText(String text) {
        this.text = text;

        return this;
    }

    public MimeMessagePreparator build() {
        return mimeMessage -> {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(text, true);
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...