Как запустить простой REST сервис на Spring MVC без Spring Boot?
Задача - сделать простой REST сервис на Spring MVC и Embedded Tomcat. Но сервер ни разу не стартует. Где копать?
Класс Main
import config.AppConfig;
import org.apache.catalina.Context;
import org.apache.catalina.startup.Tomcat;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import java.io.File;
import java.nio.file.Files;
public class Main {
public static void main(String[] args) throws Exception {
Tomcat tomcat = new Tomcat();
tomcat.setPort(8081);
tomcat.setSilent(false);
File baseDir = Files.createTempDirectory("embedded-tomcat").toFile();
Context context= tomcat.addWebapp("",baseDir.getAbsolutePath());
// Create a Spring application context
AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
appContext.register(AppConfig.class);
// Create a DispatcherServlet and register it with Tomcat
DispatcherServlet dispatcherServlet = new DispatcherServlet(appContext);
Tomcat.addServlet(context, "dispatcherServlet", dispatcherServlet).setLoadOnStartup(1);
context.addServletMappingDecoded("/*", "dispatcherServlet");
tomcat.start();
tomcat.getServer().await();
}
}
Собственно REST контроллер:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestRest {
@GetMapping("/data")
public String getSimpleData(){
return "Hi!";
}
}
И AppConfig:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.test.esm")
public class AppConfig implements WebMvcConfigurer {
}
И я получаю вроде нормальный старт:
мар. 25, 2023 11:38:18 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Tomcat]
мар. 25, 2023 11:38:18 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/10.1.7]
мар. 25, 2023 11:38:18 AM org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
INFO: No global web.xml found
мар. 25, 2023 11:38:19 AM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
мар. 25, 2023 11:38:19 AM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
мар. 25, 2023 11:38:19 AM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring DispatcherServlet 'dispatcherServlet'
мар. 25, 2023 11:38:19 AM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Initializing Servlet 'dispatcherServlet'
мар. 25, 2023 11:38:19 AM org.springframework.web.servlet.FrameworkServlet initServletBean
INFO: Completed initialization in 324 ms
но! Сервер не запускается и порту 8081 глухо и никто не отзывается.
curl: (7) Failed to connect to 127.0.0.1 port 8081 after 2047 ms: Connection refused
Источник: Stack Overflow на русском