如何设置配置,以便Thymeleaf呈现我的html模板

时间:2019-01-25 14:37:04

标签: html spring thymeleaf

这是我在Stack上遇到的第一个问题,如果无法正确格式化,我深表歉意。

我有一个应用程序,可以在货件状态更改时使用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;
//    }

编辑

与同事在工作中交谈后,他发现了这个问题。事实证明,我忽略了构建所有内容的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 :(得分:0)

再次。解决方案非常简单,但是我在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);
        };
    }
}