SpringBoot Controller не может разрешить вид с именем home - PullRequest
0 голосов
/ 26 марта 2020

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 &amp; 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>

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Я думаю, что мы можем использовать Thymeleaf.

Удалить следующее из application.properties

spring.mvc.view.prefix=/resources/view/
spring.mvc.view.suffix=.html

Чтобы использовать шаблонизатор thymeleaf вместо JSP & JSLT, добавьте зависимость

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

По умолчанию тимилеф будет искать в src/main/resources/templates с .html файлами (jar deploy). Чтобы развернуть как войну, измените конфигурацию по умолчанию в application.properties

Ссылка: https://github.com/hovermind/springboot-mvc/blob/master/README.md#thymeleaf -instead-of- jsp

Структура файла enter image description here

Ссылка: По умолчанию, где Spring Boot ожидает представления для храниться?

0 голосов
/ 26 марта 2020

Изменить @RequestMapping("\") на @RequestMapping("")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...