当前位置: 首页 > 知识库问答 >
问题:

无法运行支持Thymeleaf的Spring Boot WebMVC

莫选
2023-03-14

我已经搜索了很多,但我没有找到我的问题的答案,所以我把我的问题贴在这里。请看一看,并提出解决方案,我错了。

我已经使用spring工具套件(STS)创建了spring boot web mvc项目,该项目支持thymeleaf。当我运行它时,给我“白标签错误页面”页面。这意味着找不到映射。

努力:

网络配置。JAVA

package com.springthymeleaf.config;

import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

@Configuration
@ComponentScan("com.springthymeleaf")
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter  {

    @Bean
    ServletRegistrationBean servletRegistration(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean();
        registrationBean.addUrlMappings("/console/*");
        return registrationBean;
    }

    //start Thymeleaf specific configuration
    @Bean(name ="templateResolver") 
    public ServletContextTemplateResolver getTemplateResolver() {
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
//      templateResolver.setPrefix("/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("XHTML");
    return templateResolver;
    }
    @Bean(name ="templateEngine")       
    public SpringTemplateEngine getTemplateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(getTemplateResolver());
    return templateEngine;
    }
    @Bean(name="viewResolver")
    public ThymeleafViewResolver getViewResolver(){
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); 
        viewResolver.setTemplateEngine(getTemplateEngine());
    return viewResolver;
    }
    //end Thymeleaf specific configuration
    @Bean(name ="messageSource")
    public MessageSource getMessageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("/WEB-INF/i18/thymeleafResource");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}

安全Configuration.java

package com.springthymeleaf.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests().antMatchers("/").permitAll();
    }
}

ServletInitializer。JAVA

package com.springthymeleaf;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringThymeLeafApplication.class);
    }

}

SpringThymeLeafApplication.java

package com.springthymeleaf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringThymeLeafApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringThymeLeafApplication.class, args);
    }
}

IndexController.java

package com.springthymeleaf.controllers;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index(){
        return "index";
    }
}

我已经创建了索引。html文件,位于resources/templates文件夹中。但我还是犯了那个错误。我在网上搜索了很多,但没有找到线索。请有人帮帮我。

共有3个答案

阎知
2023-03-14

当您添加thymeleaf依赖项时,Spring boot会执行所有自动配置。那么你应该做以下事情。

>

  • 删除您在WebConfig.java上的所有thymeleaf配置
  • 如果您使用Maven,请确保您的pom.xml有以下依赖项,否则如果您使用gradle,请检查Spring网站上的等效项:

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

    第三,确保扫描控制器的位置,在SpringEleaf应用程序中添加以下内容。爪哇:

    @ComponentScan(base Packages="your.path.to.controllers")

    最后,你必须添加你的。html文件到资源/模板

  • 黄永怡
    2023-03-14

    Spring Boot已经为您配置了Thymeleaf,所以无需手动配置。删除所有与Thymeleaf相关的配置,同时删除@EnableWebMvc,因为这会干扰Spring Boot自动配置。@ComponentScan也是冗余的。

    Spring Boot还为您注册了一个MessageSource,所以不需要配置它。不知道您要做什么servlet注册,但这是你唯一需要的。

    我还建议删除您的控制器,并使用一个视图控制器,您可以在您的WebConfig类中配置该控制器。

    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter  {
    
        @Bean
        ServletRegistrationBean servletRegistration(){
            ServletRegistrationBean registrationBean = new ServletRegistrationBean();
            registrationBean.addUrlMappings("/console/*");
            return registrationBean;
        }
    
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("index");
        }
    }
    

    要让自动配置的消息源拾取自定义包,请将以下内容添加到src/main/resources/application。属性

    spring.messages.basename=/WEB-INF/i18/thymeleafResource
    

    我还建议简单地让springbootservletializer扩展springbootservletializer

    @SpringBootApplication
    public class SpringThymeLeafApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringThymeLeafApplication.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(SpringThymeLeafApplication.class);
        }
    }
    

    还要确保模板在src/main/resources/templates中,而不是在src/main/resources/resources/templates中,否则这些模板将找不到。

    戈宏义
    2023-03-14

    实际上,Spring Boot配置了Thymeleaf。它应该与以下设置一起工作:

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter
    {
        @Override
        protected void configure(HttpSecurity http) throws Exception
        {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin().loginPage("/login").defaultSuccessUrl("/").permitAll() // http://docs.spring.io/spring-security/site/docs/4.0.3.RELEASE/reference/htmlsingle/#jc-form
                    .and()
                .logout().permitAll(); // http://docs.spring.io/spring-security/site/docs/4.0.3.RELEASE/reference/htmlsingle/#jc-logout
        }
    
        @Override
        public void configure(WebSecurity web) throws Exception
        {
            web
                .ignoring()
                    .antMatchers("/resources/**"/*, ... */);
        }
    }
    
    @Controller
    public class LoginController
    {
        @RequestMapping("/login")
        static String login(Model model)
        {
            return "login";
        }
    }
    
     类似资料:
    • 我有一个Java/SpringBoot服务,它使用Thymeleaf将来自其他位置的HTML和CSS片段组装成PDF文档。我注意到,我内联到文档中的CSS使用Flexbox属性:。然而,Thymeleaf似乎不遵守这些CSS规则。Thymeleaf是否支持Flexbox和CSS3功能?

    • 我正在尝试让Spring 4.1.9和Thymeleaf 2.1.5渲染XHTML Basic 1.1页面,它们具有以下序言: 简单地在模板中使用它是行不通的,因为百里香叶不能识别doctype。 org . thyme leaf . exceptions . templateprocessingexception:使用public id "-//W3C//DTD XHTML Basic 1.1/

    • 我试图将视图与结合使用。我有一个实体,拥有一组电子邮件,我想在Thymeleaf模板中访问这些电子邮件: 在用户中。斯卡拉 在一些模板中。html 问题是Spring表达式求值器(Thymeleaf将表达式求值任务委托给它)只理解Java集合类型,因此试图获取Scala列表的第一个元素()/>)失败,出现异常。 我试图深入SpEL源代码,找到一个可以添加Java到Scala转换的地方。似乎如果我可

    • 问题内容: 我们有几个数据模式,我们研究了向Liquibase的迁移。(其中一种数据模式已经迁移到Liquibase)。 对我们来说重要的问题是Liquibase是否支持空运行: 我们需要在所有架构上运行数据库更改而无需提交,以确保我们没有问题。 如果成功,则所有数据库更改都将再次通过提交运行。 答案后添加 我阅读了有关updateSQL的文档,但它不能满足“快速运行”的要求。它只是生成SQL(在

    • 出于某种原因,每次我尝试在我的管道(ApacheBeamPython)中创建schema ware PCollection时,使用并尝试在数据流上运行它,我得到一个如下所示的致命错误,该错误导致工作进程在VM上死亡。奇怪的是,当我使用Directrunner在本地运行时,我没有遇到这个错误。 我想确保这不是我在自定义代码中犯的愚蠢错误。我尝试了谷歌的例子,比如下面的片段简化自:https://gi