SpringBoot: 无法访问本地主机(404)上的 REST 控制器

我试图在 SpringBoot 网站上调整 REST 控制器示例。 不幸的是,当我试图访问 localhost:8080/item URL 时,出现了以下错误。

{
"timestamp": 1436442596410,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/item"
}

波姆:

<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>SpringBootTest</groupId>
<artifactId>SpringBootTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<javaVersion>1.8</javaVersion>
<mainClassPackage>com.nice.application</mainClassPackage>
<mainClass>${mainClassPackage}.InventoryApp</mainClass>
</properties>


<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>${javaVersion}</source>
<target>${javaVersion}</target>
</configuration>
</plugin>


<!-- Makes the Spring Boot app executable for a jar file. The additional configuration is needed for the cmd: mvn spring-boot:repackage
OR mvn spring-boot:run -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>


<configuration>
<mainClass>${mainClass}</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>


<!-- Create a jar with a manifest -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>${mainClass}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>


<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot. This replaces the usage of the Spring Boot parent POM file. -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>


<!-- more comfortable usage of several features when developing in an IDE. Developer tools are automatically disabled when
running a fully packaged application. If your application is launched using java -jar or if it’s started using a special classloader,
then it is considered a 'production application'. Applications that use spring-boot-devtools will automatically restart whenever files
on the classpath change. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</dependencyManagement>


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


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


<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
</dependencies>
</project>

初学者-申请:

package com.nice.application;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class InventoryApp {
public static void main( String[] args ) {
SpringApplication.run( InventoryApp.class, args );
}
}

REST-控制器:

package com.nice.controller;
@RestController // shorthand for @Controller and @ResponseBody rolled together
public class ItemInventoryController {
public ItemInventoryController() {
}


@RequestMapping( "/item" )
public String getStockItem() {
return "It's working...!";
}


}

我和 Maven 一起做这个项目。 以 jar (spring-boot: run)和 IDE (Eclipse)的形式启动它。

控制台日志:

2015-07-09 14:21:52.132  INFO 1204 --- [           main] c.b.i.p.s.e.i.a.InventoryApp          : Starting InventoryApp on 101010002016M with PID 1204 (C:\eclipse_workspace\SpringBootTest\target\classes started by MFE in C:\eclipse_workspace\SpringBootTest)
2015-07-09 14:21:52.165  INFO 1204 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7a3d45bd: startup date [Thu Jul 09 14:21:52 CEST 2015]; root of context hierarchy
2015-07-09 14:21:52.661  INFO 1204 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2015-07-09 14:21:53.430  INFO 1204 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2015-07-09 14:21:53.624  INFO 1204 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2015-07-09 14:21:53.625  INFO 1204 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.23
2015-07-09 14:21:53.731  INFO 1204 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2015-07-09 14:21:53.731  INFO 1204 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1569 ms
2015-07-09 14:21:54.281  INFO 1204 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2015-07-09 14:21:54.285  INFO 1204 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-07-09 14:21:54.285  INFO 1204 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-07-09 14:21:54.508  INFO 1204 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7a3d45bd: startup date [Thu Jul 09 14:21:52 CEST 2015]; root of context hierarchy
2015-07-09 14:21:54.573  INFO 1204 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-07-09 14:21:54.573  INFO 1204 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2015-07-09 14:21:54.594  INFO 1204 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-09 14:21:54.594  INFO 1204 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-09 14:21:54.633  INFO 1204 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-09 14:21:54.710  INFO 1204 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2015-07-09 14:21:54.793  INFO 1204 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2015-07-09 14:21:54.795  INFO 1204 --- [           main] c.b.i.p.s.e.i.a.InventoryApp          : Started InventoryApp in 2.885 seconds (JVM running for 3.227)
2015-07-09 14:22:10.911  INFO 1204 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2015-07-09 14:22:10.911  INFO 1204 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2015-07-09 14:22:10.926  INFO 1204 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 15 ms

到目前为止我所做的努力:

  • 使用应用程序名称访问 URL (InventoryApp)
  • 把另一个 @RequestMapping("/")放在 ItemInventoryController的班级水平

据我所知,在使用 SpringBoot 时,我不需要应用程序上下文?

我还可以做什么来通过 URL 访问该方法?

349920 次浏览

尝试将以下内容添加到 InventoryApp 类中

@SpringBootApplication
@ComponentScan(basePackageClasses = ItemInventoryController.class)
public class InventoryApp {
...

Spring-boot 将扫描 com.nice.application以下包中的组件,因此如果控制器在 com.nice.controller中,则需要显式地进行扫描。

马特补充道:

给你所述,@SpringBootApplication会自动插入所需的注释: @Configuration@EnableAutoConfiguration,以及 @ComponentScan; 然而,@ComponentScan只会寻找与应用程序在同一个包中的组件,在这种情况下你的 com.nice.application,而你的控制器驻留在 com.nice.controller。这就是为什么你得到404,因为应用程序没有在 application包中找到控制器。

有两种方法可以克服这个问题

  1. 将启动应用程序放在包结构的开始位置,并将所有控制器放在其中。

    例如:

    包 com.spring.boot.app;-启动应用程序(即 Main Method-SpringApplication.run (App.class,args) ;)

    您休息控制器在与相同的包结构 例如: 包 com.spring.boot.app.rest;

  2. 在 Bootup 包中显式定义 Controller。

方法1比较干净。

我有这个问题,你需要做的是修复你的软件包。如果您从 http://start.spring.io/下载了这个项目,那么您的主类就在某个包中。例如,如果主类的包是: “ com.example”,那么您的控制器必须在包中: “ com.example.controller”。希望这个能帮上忙。

您需要修改 Starter-Application 类,如下所示。

@SpringBootApplication


@EnableAutoConfiguration


@ComponentScan(basePackages="com.nice.application")


@EnableJpaRepositories("com.spring.app.repository")


public class InventoryApp extends SpringBootServletInitializer {..........

并更新 Controller、 Service 和 Repository 包结构,如下所述。

例如: REST-Controller

它必须修改为
package com.nice.application.controller;

您需要遵循适当的包结构的所有包,在 SpringBootMVC 流程。

因此,如果您正确地修改您的项目包包结构,那么您的弹簧启动应用程序将正常工作。

SpringBoot 开发人员建议将您的主应用程序类定位在根包中的其他类之上。使用根包还允许使用@Component entScan 注释,而无需指定 基本包属性。< a href = “ http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/htmlsingle/# using-boot-location-the-main-class”rel = “ noReferrer”> 详细信息 但要确保存在自定义根包。

@GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE)代替 @RequestMapping( "/item" )

也许能帮到别人。

例如,如果您的服务、控制器在 springBoot.xyz 包中,那么您的主类应该在 springBoot 包中,否则它不会扫描下面的包

在使用下面的代码执行服务之后,我得到了同样的404响应

@Controller
@RequestMapping("/duecreate/v1.0")
public class DueCreateController {


}

回应:

{
"timestamp": 1529692263422,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/duecreate/v1.0/status"
}

在将其更改为以下代码之后,我收到了正确的响应

@RestController
@RequestMapping("/duecreate/v1.0")
public class DueCreateController {


}

回应:

{
"batchId": "DUE1529673844630",
"batchType": null,
"executionDate": null,
"status": "OPEN"
}

我有完全相同的错误,我没有给基本包。给正确的基本包,解决它。

package com.ymc.backend.ymcbe;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
@ComponentScan(basePackages="com.ymc.backend")
public class YmcbeApplication {


public static void main(String[] args) {
SpringApplication.run(YmcbeApplication.class, args);
}


}

注意: 不包括。控制器 @ Component entScan (basePackages = “ com.ymc.backend.controller”) ,因为 i 有许多其他组件类,我的项目不扫描,如果我 给我,控制器

下面是我的控制器示例:

package com.ymc.backend.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;




@RestController
@CrossOrigin
@RequestMapping(value = "/user")
public class UserController {


@PostMapping("/sendOTP")
public String sendOTP() {
return "OTP sent";
};




}

有时候弹簧启动会表现得很奇怪。我在应用程序类中指定了下面的内容,它可以正常工作:

@ComponentScan("com.seic.deliveryautomation.controller")

因为 Url 大小写敏感性,我遇到了404的问题。

比如说 应该使用 http://www.example.com/api/getEmployeeData访问 @RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET)。如果我们使用 http://www.example.com/api/getemployeedata,就会得到404错误。

注: http://www.example.com只是参考我上面提到的。它应该是你的域名,你托管你的应用程序。

经过大量的斗争,并应用所有其他的答案在这个职位,我得到的问题是与该网址只。这可能是个愚蠢的问题。但是花了我两个小时。所以我希望它能帮到别人。

对我来说,我在 pom.xml 中添加 spring-web 而不是 spring-boot-starter-web

当我将它从 spring-web 替换为 spring-boot-starter-web 时,所有的映射都显示在控制台日志中。

如果我们使用以下方法,它也可以工作:

@SpringBootApplication(scanBasePackages = { "<class ItemInventoryController package >.*" })

可能是端口8080上运行着其他的东西,实际上您是错误地连接到它的。

一定要检查一下,特别是如果你有码头工人带来了其他你不能控制的服务,并正在端口转发这些服务。

您可以在 POM 中添加。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>XXXXXXXXX</version>
</dependency>

问题在于您的包结构。Spring Boot Application 有一个特定的包结构,允许 Spring 上下文在其上下文中扫描和加载各种 bean。

在 com.nice.application 中存在 Main Class,在 com.nice.controller 中存在控制器类。

将 com.nice.controller 包移到 com.nice.application 中,这样 Spring 就可以访问 bean 了。

另一个解决方案是: 在我的例子中,问题是我有一个类级别的 @RequestMapping("/xxx")(在我的控制器中) ,并且在公开的服务中我有 @PostMapping (value = "/yyyy")@GetMapping (value = "/zzz"); 一旦我注释了 @RequestMapping("/xxx")并且在方法级别上管理了所有的 @RequestMapping("/xxx"),就像魔法一样工作。

对我来说,问题在于我设置应用程序的方式总是在启动后立即关闭。因此,当我试着访问控制器时,应用程序已经不再运行了。 在 这根线中解决了立即关闭的问题。

将 Return 类型从 String 更改为 ResponseEntity

Like :
@RequestMapping( "/item" )
public ResponseEntity<String> getStockItem() {
return new ResponseEntity<String>("It's working...!", HttpStatus.OK);
}

@ SpringBootApplication @ Component entScan (basePackages = {“ com.rest”})//basePackageClass = HelloController.class) //使用上述组件扫描添加包 公共类 RestfulWebServicesApplication {

public static void main(String[] args) {
SpringApplication.run(RestfulWebServicesApplication.class, args);
}

}

我找到了一个关于这个问题的很好的线索。

Https://coderanch.com/t/735307/frameworks/spring-boot-rest-api

控制器 api 应该位于子目录结构中,以自动检测控制器。否则可以使用注释参数。

@SpringBootApplication(scanBasePackages = {"com.example.demo", "com.example.Controller"})

造成这个错误的原因可能有三个:

1 >

检查你所要求的网址是否正确

2 > 检查你的

使用 MVC,然后使用@Controller,否则使用@RestController

3 > 检查

是否已将 Controller 包(或 Class)置于根目录之外 包示例: com.example.demo-> 是您的主要代码 包裹

将控制器包放在 com.example.demo.controller 中

控制器应该在同一命名空间中可访问 这就是你所拥有的 enter image description here

就该这样

enter image description here

我也有同样的问题,因为我创建了一个带有 @Configuration注释的 内部阶级,它以某种方式禁止了组件扫描。

我也遇到过同样的问题,虽然上面的解决方案本身是正确的,但它们并不适合我,我发现了另一个可能的解决方案——如果做一个 Maven 更新或者一个项目干净利落地解决了问题,你必须从端口关闭应用程序,然后重新启动你的应用程序。

简而言之,打开一个命令提示符,并运行以下两个命令:

netstat -ano | findstr :8080

这个命令将定位在您的应用程序正在运行的端口附加的进程 ID-请确保指定端口,如果您有它的任何地方以外的默认。

您将得到以下输出: enter image description here

您所关心的是最后一列中的数字,它是与运行应用程序实例的端口相关联的进程 ID。

如果您正在使用 STS4进行开发,您也可以在控制台的顶部边缘看到 PID,但是您必须眯着眼睛才能看到它:

enter image description here

此时,运行下一个命令来终止进程:

taskkill /pid 22552 /f

结果是:

enter image description here

请记住,每次运行应用程序时都会有不同的 PID。

最后,您可以再次运行它,这样应该就可以了。

更多相关资料: 关闭网络连接

以编程方式关闭 SpringBoot 应用程序