Развертывание ресурсов на встроенном сервере Tomcat с использованием Spring Boot

У меня есть проект, в котором данные из нескольких источников обрабатываются в некоторые структуры данных. После того, как программа закончит построение этих структур, я хочу, чтобы она настроила сервер, который позволит пользователям настраивать эти структуры вручную. Я решил, что Spring MVC на встроенном сервере Tomcat, настроенном с использованием Spring Boot, — это как раз то, что мне нужно.

Я хочу использовать 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 есть файл представления, ответ сервера на URL-адрес 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. Пусть сервер работает в каталоге, где ресурсы уже находятся

Моя проблема в том, что я не знаю, как это сделать или какой подход лучше. Что-то мне подсказывает, что 1 - лучшая мудрость, но любое предложение приветствуется.

Изменить

Хорошо, я закончил с чем-то, что, кажется, работает. Хотя ответ Джо определенно помог мне встать на путь, также кажется, что мне пришлось изменить конфигурацию 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, и почему это было необходимо?


person Halle Knast    schedule 04.01.2014    source источник
comment
Spring Boot не работает (много) с Spring 3, поэтому, когда тимелеаф выпустил свои пакеты spring4, Boot переключился на их использование. Идентификатор артефакта отличается, поэтому он не работал у вас со старым. Изменение определенно произошло после M6, поэтому, если вы хотите получить самую последнюю и лучшую версию (включая, вероятно, M7), вам понадобятся зависимости тимелеафа spring4.   -  person Dave Syer    schedule 05.01.2014


Ответы (1)


Корень контекста сервлета — не лучшее место для шаблонов на встроенном сервере. Есть способ сделать это, но на вашем месте я бы плыл по течению и использовал путь к классам. Если вы разрешите Spring Boot настраивать преобразователь шаблонов (также рекомендуется), то по умолчанию он будет искать в classpath:/templates. В базе кода загрузки есть несколько примеров, использующих тимелеаф, поэтому легко изменить один из них, если у вас другие требования.

person Dave Syer    schedule 04.01.2014