I am trying to create a simple REST service with Spring Boot following this tutorial . The "Hello World" html file from the webapp folder ( index.html
) is opening on http://localhost:8080/my-rest-app/
(I created a Maven-Web-App because I want to have a "Welcome Page" for the Service). But if I try to access the REST service on http://localhost:8080/my-rest-app/user
I get a 404 message.
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>service</groupId>
<artifactId>my-rest-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>my-rest-app</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.java:
package service.my.rest.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//@ComponentScan({"service.my.rest.app", "service.my.rest.app.controller"})
//@ComponentScan(basePackageClasses = UserController.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
UserController.java:
package service.my.rest.app.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser() {
return "Hello";
}
}
What am I missing? Is the URL to the service wrong? I read somewhere that the context path of the Spring Boot REST service is always /
, that would meant that I have to access the service over http://localhost:8080/my-rest-app/
but this does not working ether (without index.html
). Changing the context path in the application.properties
with server.contextPath=/my-rest-app
and server.port=8080
also didn't help.
The problem was the build and deploy process. Thank you @chrylis for the hint.
package service.my.rest.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan({"service.my.rest.app"})
public class Application extends SpringBootServletInitializer {
private static Class<Application> application = Application.class;
public static void main(String[] args) {
SpringApplication.run(application, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(application);
}
}
I had to extend my App to build and deploy a war file , because Spring Boot is actually designed to produce a jar .
If your controller is into an external module you can provvide whitch componet autoconfigure by filling file: src/main/resources/MATA_INF/sping.factories
if ie your controller is:
public ResponseEntity<?> execCommand(ComandoStr msg) {
@RequestMapping(value = "/api/exec")
@RestController
public class ExecController {
@PostMapping(value = "command")
public ResponseEntity<?> execCommand(ComandoStr msg) {
...
}
}
in sping.factories you need to add entry
imp.macchina.webapi.ExecController
then the controller get registered
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.