Ich habe eine Spring-Anwendung, aber meine Config für Thymeleaf wird komplett ignoriert. Was mache ich falsch? Ich brauche Thymeleaf, um externe Javascript-Dateien zu verarbeiten, aber ohne eine funktionierende Config kann ich keinen Javascript Template Resolver hinzufügen.Thymeleaf Template Engine Bean ignoriert
Ich weiß, dass es nicht funktioniert, weil Thymeleaf sagt mir, dass HTML5-Modus veraltet ist, aber wie Sie sehen können, stelle ich den Modus auf HTML.
package de.xy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@EntityScan("de.xy.model")
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
Config
package de.xy.config;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
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.WebMvcConfigurerAdapter;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
@Configuration
@EnableWebMvc
@ComponentScan("de.xy")
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
private ApplicationContext applicationContext;
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());
engine.addDialect(new SpringSecurityDialect());
return engine;
}
private ITemplateResolver templateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/templates/");
resolver.setTemplateMode(TemplateMode.HTML);
return resolver;
}
}
EDIT:
Arbeits Config:
@Configuration
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
private static final String UTF8 = "UTF-8";
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Bean
public ViewResolver htmlViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(htmlTemplateResolver()));
resolver.setContentType("text/html");
resolver.setCharacterEncoding(UTF8);
resolver.setViewNames(new String[] { "*.html" });
return resolver;
}
@Bean
public ViewResolver cssViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(cssTemplateResolver()));
resolver.setContentType("text/css");
resolver.setCharacterEncoding(UTF8);
resolver.setViewNames(new String[] { "*.css" });
return resolver;
}
@Bean
public ViewResolver javascriptViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine(javascriptTemplateResolver()));
resolver.setContentType("application/javascript");
resolver.setCharacterEncoding(UTF8);
resolver.setViewNames(new String[] { "*.js" });
return resolver;
}
private TemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver);
return engine;
}
private ITemplateResolver htmlTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/templates/");
resolver.setTemplateMode(TemplateMode.HTML);
return resolver;
}
private ITemplateResolver cssTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/css/");
resolver.setTemplateMode(TemplateMode.CSS);
return resolver;
}
private ITemplateResolver javascriptTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/js/");
resolver.setTemplateMode(TemplateMode.JAVASCRIPT);
return resolver;
}
}
JavascriptController:
@Controller
@RequestMapping("js")
public class JavascriptController {
@RequestMapping("somejavascriptfile.js")
public String getJS() {
return "somejavascriptfile.js";
}}
Es ist mehr als ich brauche, b ut es funktioniert (Controller tut nichts)
ich verschiedene andere Config-Klassen in dem Paket de.xy.config haben, die perfekt funktionieren (wie Datasource Beans) –
Warum folgen Sie nicht der Standard-Spring-Boot-Projekt-Organisation, dh legen Sie alle statischen Inhalt in Ressourcen-Ordner auch Thymeleaf-Dateien? Und wenn diese Abhängigkeit 'Spring-Boot-Starter-Thymeleaf' in Ihrem Klassenpfad enthalten ist, verwaltet Spring Boot selbst, den View-Resolver so zu konfigurieren, dass thymeleaf verwendet wird. – akuma8
Ich dachte, ich folgte der Standard-Spring-Boot-Projekt-Organisation ... Ich habe meine HTML-Dateien in src/main/resources/templates, und alle js und CSS-Dateien in src/main/webapp. –