2017-11-15 6 views
0

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)

+0

ich verschiedene andere Config-Klassen in dem Paket de.xy.config haben, die perfekt funktionieren (wie Datasource Beans) –

+0

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

+0

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. –

Antwort

0

ich in der Regel meine statische Inhalte wie folgt registrieren:

@Override 
protected void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/js/**", "/css/**", "/images/**").addResourceLocations("classpath:static/js/", "classpath:static/css/", "classpath:static/images/"); 
} 

Sie brauchen nicht wieder einen neuen Controller zu definieren.

EDIT

Und in Thymeleaf, zB CSS-Dateien enthalten:

<link rel="stylesheet" th:href="@{css/styles.css}" /> 
+0

Und wie bekomme ich diese Dateien von Thymeleaf verarbeitet? –

+0

Siehe die Bearbeitung, es ist für CSS, aber für JS-Dateien sollten die gleichen sein. – akuma8

+0

Ich brauche so etwas in meinen js-Dateien: var somePath =/* [[@ {/ js/file.js}]] */"/ js/file.js;" –