使用Spring Boot在嵌入式Tomcat服务器上部署资源

时间:2014-01-04 04:46:27

标签: spring tomcat spring-mvc spring-boot embedded-tomcat-7

我有一个项目,其中来自多个来源的数据正在被处理成一些数据结构。程序完成构建这些结构后,我希望它能够设置一个服务器,使用户能够手动微调这些结构。我决定使用Spring Boot设置的嵌入式Tomcat服务器上的Spring MVC正是我所需要的。

我想使用Thymeleaf作为视图技术,因此

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Main {

    public static void main(String... args) throws Exception {
        // Lots of initialization ...

        SpringApplication.run(Main.class, args);
    }

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/resources/views/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setCacheable(false);
        return resolver;

    }

    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setOrder(1);
        viewResolver.setViewNames(new String[]{"*"});
        viewResolver.setCache(false);
        return viewResolver;
    }
}

@Controller
public class WebController {
    @RequestMapping(value="/greeting", method=RequestMethod.GET)
    public String greeting() {
        return "greeting";
    }
}

但即使/resources/views/greeting.html处有一个视图文件,服务器对网址http://localhost:8080/greeting的回复也是

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "greeting", template might not exist or might not be accessible by any of the configured Template Resolvers

在调试器中逐步执行代码之后,似乎在某个时刻,ServletContext(它应该将视图文件作为流返回)在一个临时文件夹中查找,如

C:\Users\Michael\AppData\Local\Temp\tomcat-docbase.971027024999448548.8080

是空的。

现在我知道我需要

  1. 在服务器启动时将资源部署到临时文件夹

  2. 让服务器在资源已经

  3. 的目录中运行

    我的问题只是我不知道该怎么办,或者哪种方法最好。有些东西告诉我,1是更好的智慧,但任何建议都是受欢迎的。

    修改

    好的,我最终找到了似乎有用的东西。虽然Joe的回答肯定帮助我顺利进行,但似乎我不得不以令我困惑的方式改变我的Maven配置。

    将模板greeting.html放入/resources/templates/greeting.html并将resources添加到构建路径后,我收到了错误

    javax.servlet.ServletException: Circular view path [greeting]: would dispatch back to the current handler URL [/word/greeting] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
    

    换句话说,Thymeleaf似乎没有正确配置。经过一番调整后,我最终将spring-boot-starter-parent中的pom.xml版本从0.5.0.BUILD-SNAPSHOT更改为0.5.0.M6

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--<version>0.5.0.BUILD-SNAPSHOT</version>-->
        <version>0.5.0.M6</version>
    </parent>
    

    并从Thymeleaf依赖项中删除版本标记

    <dependencies>
        <!-- ... -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring3</artifactId>
            <!--<version>${thymeleaf-spring3-version}</version>-->
        </dependency>
    </dependencies>
    

    在此之后,它奏效了。

    有人可以解释为什么我需要更改spring-boot-starter-parent的版本才能从thymeleaf-spring3删除版本标记,以及为什么需要这样做?

1 个答案:

答案 0 :(得分:3)

servlet上下文根不是嵌入式服务器中模板的最佳位置。有一种方法可以做到这一点,但如果我是你,我会使用流程并使用类路径。如果允许Spring Boot配置模板解析器(也建议使用),则默认情况下它将查找classpath:/templates。有几个示例在Boot代码库中使用百万美元,因此如果您有不同的要求,应该很容易修改其中一个。