stackoverflow!
Проблема
Я боролся с этой надоедливой ошибкой в течение нескольких дней. Я нашел многих в такой же ситуации, но их решения не сработали для меня. Я использую Spring Boot и пытаюсь создать домашнюю страницу для своего проекта. В настоящее время внутри моего класса контроллеров у меня есть эта настройка:
@RequestMapping("/")
public String getHomePage(Map<String, Object> model) {
return "home";
}
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь загрузить URL '/', я получаю это сообщение об ошибке:
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Mar 25 14:46:01 MDT 2020
There was an unexpected error (type=Internal Server Error, status=500).
Could not resolve view with name 'home' in servlet with name 'dispatcherServlet'
javax.servlet.ServletException: Could not resolve view with name 'home' in servlet with name 'dispatcherServlet'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1353)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at
Из этого журнала видно, что мой контроллер не может найти домашнюю страницу. jsp домашняя страница. Я полагаю, что изначально у меня была jsp страница в папке resources / view /.
Я исследовал проблемы на опыте других:
RequestMapping DisplatcherServlet сопоставление не найдено В этой записи указывается, что их REST API работает некорректно, но все компоненты моего API работают должным образом.
По умолчанию Где Spring Boot ожидает сохранения представлений? Его выводы были интересны:
JSP просто не очень хорошо работают с Spring Boot, поскольку он имеет ограничения в зависимости от выбранного встроенного контейнера. ... [Он далее объясняет все, что необходимо, это] шаблон Spring Boot по умолчанию и 2 зависимости ThymeLeaf с представлениями, именуемыми как ViewName. html, помещенный в src / main / resources / templates [это все, что необходимо ].
Однако даже после попытки изменить мой проект путем добавления зависимостей thymeleaf и thymeleaf-spring4, удалив мою пружину. mvc .view.prefix и spring. mvc .view.suffix (для установки по умолчанию) и копирование моего домашнего файла. html в папку src / main / resources / templates, проблема продолжалась.
Потерянный черновик
Первоначально у меня было еще несколько источников, перечисленных здесь, но мой черновик был потерян, и я не могу потрудиться снова просмотреть все эти посты. Мне нужно опубликовать этот вопрос. В других источниках были варианты того, где я должен разместить свой home.html / home. jsp. И при каждом предложении я обязательно переключаюсь между. jsp и. html, чтобы проверить их оба. Некоторые говорили, что META-INF не работает правильно, и чтобы убедиться, что вы не указали его в качестве имени папки. Некоторые говорили, что для того, чтобы он функционировал, вам нужно вложить папку ресурса в существующую папку ресурса. Я также следил за этими исправлениями, но ни один из них не помог. Также не было никаких изменений в ошибке, она все еще не могла найти home.jsp / home. html. Я много раз обновлял свои application.properties, чтобы протестировать эти решения, в настоящее время мой префикс и суффикс представления таковы:
spring.mvc.view.prefix=/resources/view/
spring.mvc.view.suffix=.html
Я действительно был в курсе своей весенней версии (2.2. 5.RELEASE). Еще одно небольшое замечание: я использую Spring Data REST, но мой API отдыха установлен на / api /
Мой репозиторий можно увидеть здесь: https://github.com/CloakingOcean/CampaignChronicle
I здесь также будут перечислены основные файлы и мои зависимости.
Сообщение об ошибке:
Сообщение об ошибке
Структура файла:
(Другие тестовые папки удалены для ясности предполагаемого дома. html местоположение)
Структура файла (ссылка)
CampaignchronicleApplication. java
package com.exitium.campaignchronicle;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@SpringBootApplication
@EnableWebMvc
public class CampaignchronicleApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(CampaignchronicleApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(CampaignchronicleApplication.class, args);
}
}
MainController. java
package com.exitium.campaignchronicle.controller;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class MainController {
@RequestMapping("/")
public String getHomePage(Map<String, Object> model) {
return "home";
}
}
application.properties
#
# JDBC properties
#
spring.datasource.url=jdbc:mysql://localhost:3306/campaignchronicle
spring.datasource.username=cloakingocean
spring.datasource.password=9QfsJGA4V6M74LB
#
# Spring Data REST properties
#
spring.data.rest.base-path=/api
spring.mvc.view.prefix=/resources/view/
spring.mvc.view.suffix=.html
# ==============================================================
# = Logging springframework
# ==============================================================
logging.level.org.springframework.jdbc=DEBUG
logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.http=DEBUG
SecurityConfig. java
package com.exitium.campaignchronicle.config;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.dataSource(dataSource);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
.and().formLogin().permitAll();
}
@Bean
public PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
Pom. xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.exitium</groupId>
<artifactId>campaignchronicle</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>campaignchronicle</name>
<description>Note taking application for Dungeons & Dragons players</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Add dependency for Spring Data REST -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- <dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>9.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>