Spring Boot: localhost (404) üzerindeki REST Controller'a erişilemiyor


105

Spring Boot web sitesinde REST Controller örneğini uyarlamaya çalışıyorum. Maalesef localhost:8080/itemURL'ye erişmeye çalışırken aşağıdaki hatayı alıyorum .

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

POM:

<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 its 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>

Başlangıç-Uygulama:

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-Denetleyici:

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...!";
   }

}

Bu projeyi Maven ile inşa ediyorum. Onu kavanoz olarak (yaylı önyükleme: koş) ve IDE'nin (Eclipse) içinde başlattım.

Konsol Günlüğü:

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

Şimdiye kadar denediklerim:

  • URL'ye uygulama adıyla erişim (InventoryApp)
  • @RequestMapping("/")Sınıf düzeyine bir tane daha koyunItemInventoryController

Anladığım kadarıyla, Spring Boot'u kullanırken bir uygulama bağlamına ihtiyacım olmayacak. Haklı mıyım

Yönteme URL aracılığıyla erişmek için başka ne yapabilirim?


Uygulamayı nasıl çalıştırıyorsunuz? Belki bazı günlükler ekleyebilir misiniz?
wjans

Eclipse ile ayrı ayrı ve mvn yaylı önyükleme ile denedim: koş (kavanoz olarak). Günlükler için yukarıya bakın (düzenlenmiş)
mchlfchr

Başlangıç ​​günlüğünden denetleyicinizi buluyormuş gibi görünmüyor, denetleyici sınıfınız hangi pakette?
MattR

1
Ayrı bir pakette. Ana yönteme sahip başlangıç ​​sınıfı, denetleyici "denetleyici" paketindeyken "uygulama" dadır. Bu şekilde yapılandırılmış örnekler (spring.io'dakileri değil) gördüm.
mchlfchr

4
Varsayılan olarak, yaylı önyükleme, uygulama sınıfınızla aynı paketteki bileşenleri veya "altındaki" paketleri (aynı önek) tarayacaktır. Aksi açıkça onlar için tarama gerekir, örneğin @ComponentScan kullanarak
MattR

Yanıtlar:


200

Aşağıdakileri InventoryApp sınıfınıza eklemeyi deneyin

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

Spring-boot, aşağıdaki paketlerdeki bileşenleri tarayacaktır com.nice.application, bu nedenle denetleyiciniz içeride ise, com.nice.controlleraçıkça taramanız gerekir.


Aynı sorunlarım var. Bileşenleri deniyorum ama hiçbir şey
yapmadım

1
lütfen not @SpringBootApplicationiçerir@Configuration
krzakov

9
Uygulamayı "kök" paketine, örneğin "org.whatever" ve denetleyicileri, hizmetleri alt paketlere koymak en kolay gibi görünüyor.
insan-e

7
Bende de aynı sorun var ama bu çözüme gelmeden önce buldum ... Daha fazlası. Spring boot uygulama sınıfınızı (ana yöntemin tanımlandığı) kontrolör paketine kadar bir seviye alın .. daha sonra kontrolörler bunu görebilecek ve çalışacak
Tayab Hussain

1
Ayrıca '@ComponentScan (basePackages = "com.nice.controller")' kullanabilirsiniz. Bileşen varsayılan taraması, Uygulama sınıfı olan yolda başlar ve ayrıca yardımcı paketleri de tarar. Bu durumda @ComponentScan ek açıklamasını kullanmanıza gerek yoktur. Otomatik olarak yapar. 1'den fazla denetleyiciniz varsa, bunları farklı paketlerde de bulundurmanız mümkündür, zincirleyebilirsiniz. Bu durumda çatışmalardan kaçınmak önemlidir.
hariprasad

49

MattR cevabı ekleme:

belirtildiği üzere burada , @SpringBootApplicationgerektiğinde otomatik açıklamaları ekler: @Configuration, @EnableAutoConfigurationayrıca, ve @ComponentScan; ancak, @ComponentScanyalnızca Uygulama ile aynı paketteki bileşenleri arayacaktır, bu durumda com.nice.applicationsizin kontrolörünüz içinde bulunur com.nice.controller. Bu yüzden 404'ü aldınız çünkü Uygulama applicationpakette denetleyiciyi bulamadı .


5
Bu, yukarıdaki açıklamadan tamamen net değilse, @SpringBootApplication ek açıklamasına sahip sınıf YUKARIDA veya dizin yapınızda bulmasını istediğiniz şeylerle aynı düzeyde olmalıdır. Örneğin, com.app.configuration ve com.app.controllers vardı. Application sınıfımı yanlışlıkla com.app.configuration içine koydum ve com.app.configuration'daki diğer her şey yolunda gitti, ancak com.app.controllers içindeki hiçbir şey yüklenmiyordu. Uygulama sınıfımı com.app'a taşıdım ve başka yerlerdeki çekirdekler bulundu ve işler çalışmaya başladı. Benim için çaylak hatası.
glaukommatos

2
@ComponentScan (basePackages = "com.base.package") eklemek sorunu benim durumumda çözdü
Shamli

Bu gerçekten yardımcı oluyor.
Madhu Tomy

12

SpringBoot geliştiricileri, ana uygulama sınıfınızı diğer sınıfların üzerinde bir kök paketinde bulmanızı önerir. Bir kök paketi kullanmak, @ComponentScan ek açıklamasının bir basePackage özniteliği belirtmeye gerek kalmadan kullanılmasına da izin verir . Ayrıntılı bilgi Ancak özel kök paketin mevcut olduğundan emin olun.


10

Aşağıdaki kodla yapılan servis sonrasında aldığım aynı 404 yanıtı

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

}

Tepki:

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

aşağıdaki koda değiştirdikten sonra uygun yanıt aldım

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

}

Tepki:

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

2
Diğer okuyucuların görmemesi durumunda @Controller->@RestController
Janac Meena

8

Bu sorunu yaşadım ve yapmanız gereken paketlerinizi düzeltmek. Bu projeyi http://start.spring.io/ adresinden indirdiyseniz , ana sınıfınız bir pakette bulunur. Örneğin, ana sınıfın paketi: "com.example" ise ve denetleyiciniz paketin içinde olmalıdır: "com.example.controller". Bu yardımcı olur umarım.


6

Bunun üstesinden gelmenin 2 yöntemi var

  1. Önyükleme uygulamasını paket yapısının başlangıcına yerleştirin ve tüm denetleyiciyi bunun içine koyun.

    Misal :

    paket com.spring.boot.app; - Başlatma uygulaması (yani Ana Yöntem -SpringApplication.run (App.class, args);)

    Siz Rest Controller in aynı paket yapısıyla Örnek: package com.spring.boot.app.rest;

  2. Bootup paketinde Denetleyiciyi açıkça tanımlayın.

Yöntem 1 daha temizdir.


1
Spring boot, uygulama sınıfının temel paket dışında bir paket altında olmasından nefret eder ... eğer temel paket org.someapp ise ve bunu org.someapp.app altına koyarsak bomba atar ..: - /
Priyank Thakkar

3

Starter-Application sınıfını aşağıda gösterildiği gibi değiştirmeniz gerekir.

@SpringBootApplication

@EnableAutoConfiguration

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

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

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

Ve Denetleyici, Hizmet ve Depo paketleri yapısını aşağıda belirttiğim gibi güncelleyin.

Örnek: REST-Controller

package com.nice.controller; -> Şu şekilde değiştirilmelidir:
package com.nice.application.controller;

Spring Boot MVC akışında bulunan tüm paketler için uygun paket yapısını takip etmeniz gerekir.

Dolayısıyla, proje paketi paketi yapılarınızı doğru şekilde değiştirirseniz, bahar önyükleme uygulamanız doğru şekilde çalışacaktır.


3
EnableAutoConfiguration, @SpringBootApplication'a dahil edilmiştir, bu nedenle onu eklemek gereksizdir.
Sofiane

1

Değiştir @RequestMapping( "/item" )ile @GetMapping(value="/item", produces=MediaType.APPLICATION_JSON_VALUE).

Belki birine yardımcı olur.


1
Kendim için yazdığım tanımasını sağladı nameyerine valuede @GetMapping.
vortex.alex

0

Ben de aynı hatayı yaptım, temel paket vermiyordum. Doğru temel paketi vermek, onu çözdü.

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);
    }

}

Not: .controller @ComponentScan (basePackages = "com.ymc.backend.controller") dahil değil, çünkü sadece .controller verirsem projemin taramayacağı birçok başka bileşen sınıfım var

İşte kontrolör örneğim:

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";
    };


}

0

Bazen ilkbahar botu garip davranır. Uygulama sınıfında aşağıda belirttim ve çalışıyor:

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

0

Url Büyük / Küçük Harfe Duyarlılığı nedeniyle 404 sorununu aldım .

Örneğin @RequestMapping(value = "/api/getEmployeeData",method = RequestMethod.GET)kullanılarak erişilmelidir http://www.example.com/api/getEmployeeData. Eğer kullanıyorsakhttp://www.example.com/api/getemployeedata 404 hatası alacağız.

Not: http://www.example.comsadece yukarıda bahsettiğim referans içindir. Uygulamanızı barındırdığınız alan adınız olmalıdır.

Bir sürü mücadeleden sonra ve bu yazıdaki diğer tüm cevapları uyguladıktan sonra, sorunun yalnızca o url ile olduğunu anladım. Aptalca bir sorun olabilir. Ama 2 saatime mal oldu. Bu yüzden birisine yardımcı olacağını umuyorum.


0

benim için, pom.xml'ime spring-boot-starter-web yerine spring-web ekliyordum

Yaylı ağdan yaylı önyükleme başlatıcı ağına değiştirdiğimde, tüm eşlemeler konsol günlüğünde gösterilir.


0

Aşağıdaki gibi kullanırsak da işe yarar:

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

0

8080 numaralı bağlantı noktasında başka bir şey çalışıyor olabilir ve siz aslında ona yanlışlıkla bağlanıyorsunuzdur.

Bunu kesinlikle kontrol edin, özellikle kontrol etmediğiniz diğer hizmetleri getiren liman işçileriniz varsa ve bu hizmetleri bağlantı noktası iletiyorsanız.


0

Sorun, paket yapınızla ilgili. Spring Boot Uygulaması, yay içeriğinin kendi bağlamında çeşitli çekirdekleri taramasına ve yüklemesine izin veren özel bir paket yapısına sahiptir.

Com.nice.application'da Ana Sınıfınızın olduğu yerdir ve com.nice.controller'da denetleyici sınıflarınız vardır.

Spring'in çekirdeklerinize erişebilmesi için com.nice.controller paketinizi com.nice.application'a taşıyın.


-1

POM'un içine ekleyebilirsiniz.

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

-2

Springbootapplication sınıfınızı kök pakete yerleştirin, örneğin hizmetiniz, denetleyiciniz springBoot.xyz paketindeyse, ana sınıfınız springBoot paketinde olmalıdır, aksi takdirde aşağıdaki paketleri taramaz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.