Spring MVC - очень простое веб-приложение возвращает ошибку 404 - PullRequest
0 голосов
/ 24 октября 2018

У меня очень неприятная проблема.У меня есть веб-приложение, как проект Maven, который использует Spring MVC Framework (просто хочу упомянуть, что это приложение должно быть настроено с аннотациями, я не хочу использовать XML, просто хочу посмотреть, как это работает),И когда я пытаюсь набрать // localhost: 8080 / hello, возникает ошибка 404.Когда я набираю //localhost:8080/hello.html, просматривается простой и пустой html (hello.html действительно прост - в теле я просто читаю переменную, расположенную в модели (помещенную HelloController). Конечно, результатof // localhost: 8080 является допустимой страницей индекса (index.html). Я использую сервер Tomcat 8.5.34. Кто-нибудь знает, в чем может быть проблема? Мне потребовался целый день, чтобы найти проблему, но ядействительно не знаю, что с этим делать сейчас. Я искал решение в Google и здесь, но ничего не нашел. Заранее благодарен за каждый полезный ответ!

Ниже я перечислил содержаниевсех файлов моего проекта:

Класс конфигурации - SpringConfig.java

    package com.smc.config;

import com.smc.controllers.HelloController;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import java.util.List;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.smc"})
public class SpringConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer defaultServletHandlerConfigurer) {
        defaultServletHandlerConfigurer.enable();
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver bean =
                new InternalResourceViewResolver();
        bean.setPrefix("/web/");
        bean.setSuffix(".html");
        return bean;
    }

    @Bean
    public HelloController helloController(){
        return new HelloController();
    }
    //Of course there are empty implementations of the rest methods from interface
        }

Реализация интерфейса WebApplicationInitializer - ApplicationStarter.java, который создает сервлет диспетчера (я думаю):

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class ApplicationStarter implements WebApplicationInitializer {


    public void onStartup(ServletContext sc) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = getContext();

        ctx.refresh();
        ctx.setServletContext(sc);

        sc.addListener(new ContextLoaderListener(ctx));


        ServletRegistration.Dynamic appServlet = sc.addServlet("DispatcherServlet", new DispatcherServlet(ctx));
        appServlet.setLoadOnStartup(1);
        appServlet.addMapping("*.html");
    }

    private AnnotationConfigWebApplicationContext getContext(){
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(com.smc.config.SpringConfig.class);
        return ctx;
    }
}

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>SystemMaintainContracts</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <optional>true</optional>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

    </dependencies>


</project>

Простой контроллер - HelloController.java

package com.smc.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping(value = "/hello")
    public String showIndexPage(Model model){
        model.addAttribute("hello", "hello from HelloController!");
        return "hello";
    }
}

И вот у вас есть структура моего проекта: структура проекта

1 Ответ

0 голосов
/ 24 октября 2018

DispatcherServlet настроен для ответа только на запросы, соответствующие * .html.Вот почему статические файлы (index.html, hello.html) обслуживаются.

Контроллер hello сопоставлен с / hello и не соответствует отображению сервлета диспетчера.

Обратите внимание напростой / как отображение для диспетчера.Это будет соответствовать обоим запросам.

...