У меня очень неприятная проблема.У меня есть веб-приложение, как проект 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";
}
}
И вот у вас есть структура моего проекта: структура проекта