Развертывание ресурсов на встроенном сервере 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 - лучшая мудрость, но любое предложение приветствуется.
редактировать
Хорошо, я закончил с чем-то, что, кажется, работает. Хотя ответ Джо определенно помог мне встать на пути, также оказалось, что мне пришлось изменить конфигурацию 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 ответ
Корень контекста сервлета - не лучшее место для шаблонов во встроенном сервере. Есть способ сделать это, но на вашем месте я бы пошел с потоком и использовал путь к классам. Если вы разрешите Spring Boot настроить преобразователь шаблонов (также рекомендуется), он будет выглядеть classpath:/templates
по умолчанию. Есть несколько примеров, которые используют thymeleaf в базе загрузочного кода, поэтому вам будет легко изменить один из них, если у вас есть другие требования.