Spring не может найти шаблоны html по заданному пути
Всем доброго времени суток, не так давно изучаю spring и частенько сталкивался с проблемами, которые удавалось найти исправить, но в этот раз я нашел только похожие вопросы которые все же не смогли мне помочь исправить эту проблему, поэтому пишу этот вопрос и буду максимально благодарен любой помощи!) Суть приложения состоит в записи/удалении/изменении и вывода строк из БД. У меня есть 4 контроллера, репозиторий и 4 шаблонных html страницы После запуска приложения выдается вот такая ошибка:
An error happened during template parsing (template: "ServletContext resource [/src/main/resources/templatesindex.html]") org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "ServletContext resource [/src/main/resources/templates/index.html]")
Контроллер для главной страницы:
import com.example.web.Entitys.Employees;
import com.example.web.repos.EmployeeRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
public class MOdul {
@Autowired
EmployeeRepo nameRepo;
public MOdul(EmployeeRepo nameRepo) {
this.nameRepo = nameRepo;
}
@RequestMapping("/index")
public String saveEmployee(Model model) {
return "index";
}
@PostMapping("/index")
public String formPost(@RequestParam String name,
@RequestParam String lastname,
@RequestParam String secondname,
@RequestParam String sex,
@RequestParam String dateofbirth,
@RequestParam String Work,
@RequestParam String number, Model model) {
Employees employees = new Employees(name, lastname, secondname,sex, dateofbirth, Work, number);
nameRepo.save(employees);
return "index";
}
}
Шаблон главной страницы:
<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="startbootstrap-modern-business-1.0.5/css/bootstrap.css">
<script src="startbootstrap-modern-business-1.0.5/js/bootstrap.js"></script>
<head>
<meta charset="UTF-8">
<title>Main page</title>
</head>
<body>
<div class = "main">
<form action="/index" method="post">
<label>
Имя
<input type="text" name="name">
</label><br>
<label>
Фамилия
<input type="text" name="secondname">
</label><br>
<label>
Отчество
<input type="text" name="lastname">
</label><br>
<label>
Пол
<input type="text" name="sex">
</label><br>
<label>
Дата рождения
<input type="text" name="dateofbirth">
</label><br>
<label>
Должность
<input type="text" name="Work">
</label><br>
<label>
Номер телефона
<input type="text" name="number">
</label><br>
<button type="submit" >Отправить</button>
</form>
</div>
<a href="/delete"> Delete User </a><br>
<a href="/change"> Change User </a><br>
<a href="/Employee"> Список работников</a>
</body>
</html>
SpringConfig:
@Configuration
@ComponentScan("com.example.web")
@EnableWebMvc
public class SpringConfig implements WebMvcConfigurer {
private final ApplicationContext applicationContext;
@Autowired
public SpringConfig(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("src/main/resources/templates/");
templateResolver.setSuffix(".html");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
registry.viewResolver(resolver);
}
}
Структура проекта:
P.s. полная ошибка
There was an unexpected error (type=Internal Server Error, status=500).
An error happened during template parsing (template: "ServletContext resource [/src/main/resources/templates/index.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "ServletContext resource [/src/main/resources/templates/index.html]")
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235)
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:649)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1103)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1077)
at org.thymeleaf.spring6.view.ThymeleafView.renderFragment(ThymeleafView.java:372)
at org.thymeleaf.spring6.view.ThymeleafView.render(ThymeleafView.java:192)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1415)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1159)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1098)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:537)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:631)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/src/main/resources/templates/index.html]
at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:164)
at org.thymeleaf.spring6.templateresource.SpringResourceTemplateResource.reader(SpringResourceTemplateResource.java:103)
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:223)
... 40 more
Ответы (3 шт):
В контроллере (во всех методах ) попробуйте так, убрать имя страницы из аннотации:
@RequestMapping("/")
public String saveEmployee(Model model) {
return "index";
}
Потому что возвращаемым значением вы уже задаете имя шаблона, в аннотации имя повторно не надо указывать
После сборки Spring Boot приложения, в jar файле не будет директории
src/main/resources(причинаFileNotFoundException), поможет заменаtemplateResolver.setPrefix("src/main/resources/templates/");наtemplateResolver.setPrefix("classpath:/templates/");Spring Boot может сам, без явного файла конфигурации, настроиться на работу с Thymeleaf.
@RequestMappingбез указания метода будет реагировать не только наGETно и на другие, напримерDELETEилиPATCH.
Возможно, не парсит из-за того, что страничке не указан шаблонизатор
<html xmlns:th="http://www.thymeleaf.org">
