wake-up-neo.net

Fehlermeldung "Keine Nachricht verfügbar" mit Spring Boot + REST Anwendung

Ich habe ein Demo-Bootprojekt erstellt und Restful-Services wie hier gezeigt implementiert 

@RestController
public class GreetingsController {
    @RequestMapping(value="/api/greetings", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> getGreetings(){
        return new ResponseEntity<String>("Hello World", HttpStatus.OK);
    }
}

Wenn ich versuchte, den Dienst mit dem Postman-Tool mit der URL " http: // localhost: 8080/api/greetings " als Anforderungsmethode GET aufzurufen, erhalte ich eine Fehlermeldung

{
  "timestamp": 1449495844177,
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/api/greetings"
}

Pro Spring-Boot-Anwendung muss ich das Spring Dispatcher-Servlet nicht in web.xml konfigurieren.

Kann mir jemand helfen, den fehlenden Punkt hier herauszufinden? 

8
Naveen

Vermutlich fehlt Ihnen @SpringBootApplication:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

@SpringBootApplication enthält @ComponentScan, mit dem das darin enthaltene Paket und alle untergeordneten Pakete geprüft werden. Ihr Controller ist möglicherweise nicht dabei.

7
cahen

Dies kann jemandem helfen, wie es in meinem Fall war.

Stellen Sie sicher, dass der Paketname des Controllers das abgeleitete (oder untergeordnete) Paket Ihres Spring-Hauptmethodenpakets ist.

Zum Beispiel:

Wenn das Hauptmethodenpaket com.company.demo.example lautet, sollte das Controller-Paket wie folgt aussehen com.company.demo.example.controller (wenn Sie etwas wie com.company.demo.controller angeben es wird nicht funktionieren!).

3
Mants

Drei mögliche Lösungen:

1) Stellen Sie sicher, dass sich die YourController.Java-Datei mit dem @Controller und die YourSpringBootFile.Java-Datei mit der @SpringBootApplication im selben Paket befinden. 

Dies ist zum Beispiel falsch: enter image description here

Dies ist der richtige Weg: enter image description here

Damit Sie wissen, wovon ich spreche, hier ist meine WebController.Java-Datei: 

@RestController
public class WebController {
private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(value= "/hi", method = RequestMethod.GET)
    public @ResponseBody Greeting sayHello(
            @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name) {
        System.out.println("Inside sayHello() of WebController.Java");
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

Hier ist meine JsonPostExampleProj1Application.Java:

@SpringBootApplication
public class JsonPostExampleProj1Application {

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

2) Wenn Sie möchten, dass sich Ihr Controller außerhalb des Pakets von YourSpringBootFile.Java in einem anderen Paket befindet, befolgen Sie diese Anweisungen = Spring: Führen Sie mehrere "SpringApplication.Run ()" in der Hauptmethode der Anwendung aus.

3) Versuchen Sie, @RestController anstelle von @Controller zusätzlich zu Ihrer Controller-Klasse zu verwenden.

3
Gene

Wenn Sie nur @SpringBootApplication verwenden, vergewissern Sie sich, dass sich Ihr Rest Service Controller im selben Paket wie unten befindet. 

com.testSpring->SpringBootApplication class
com.testSpring.controller->RestfulController classes
com.testSpring.model->Model classes
..etc

Wenn Sie @ComponentScan(basePackageClasses = UserController.class) verwenden, nennen Sie die Namen der Controller-Klassen. 

Abgesehen vom Anotieren des SpringBoot-Einstiegspunkts mit @SpringBootApplication((scanBasePackages = "com.duwamish.x.y"), so dass er alle Initialisierungskomponenten/Beans enthält 

Der contextPath muss auch richtig sein. Wenn die Anwendung in Tomcat mit dem Namen der Anwendung als myapplication bereitgestellt wird, siehe unten. 

$ ll /usr/local/Apache-Tomcat-8.0.42/webapps/
total 179216
12495017 drwxrwxrwx  17 urayagppd  NORD\Domain Users       578 Mar  8 11:59 ROOT
12495019 drwxrwxrwx  55 urayagppd  NORD\Domain Users      1870 Mar  8 11:59 docs
12495042 drwxrwxrwx   7 urayagppd  NORD\Domain Users       238 Mar  8 11:59 examples
12495109 drwxrwxrwx   7 urayagppd  NORD\Domain Users       238 Mar  8 11:59 Host-manager
12495114 drwxrwxrwx   8 urayagppd  NORD\Domain Users       272 Mar  8 11:59 manager
16169612 drwxr-xr-x   4 urayagppd  NORD\Domain Users       136 May  7 18:47 myapplication
16169594 -rw-r--r--   1 urayagppd  NORD\Domain Users  45340041 May  7 18:47 myapplication.war

Dann wäre REST Endpunkt /myapplication/api/greetings

Wenn der Anwendungskrieg jedoch als ROOT bereitgestellt wird, ist die Endpunktressource nur /api/greetings.

2
prayagupd

Ich bin gerade auf diesen Fehler gestoßen, und keine der oben genannten Lösungen hat für mich funktioniert. Daher füge ich eine weitere mögliche Sache hinzu, die möglicherweise auch fehlen kann. Stellen Sie sicher, dass Ihre Methode eine Anmerkung @ResponseBody Enthält.

@RequestMapping(value="/yourPath", method=RequestMethod.GET)
@ResponseBody
public String exampleMethod() {
return "test";
}
1

In meinem Fall habe ich den falschen Pfad über das Band aufgerufen.

@FeignClient(name = "currency-exchange")
@RibbonClient(name = "currency-exchange")
public interface CurrencyExchangeProxy {

    @GetMapping("/exchange/{from}/to/{to}")
    PairRateDto callForExchangeValue(@PathVariable("from") String fromValue, @PathVariable("to") String toValue);

}

Der currency-exchange-Remote-Dienst hatte keine Handler für den /exchange/{from}/to/{to}-Pfad.

Also für nicht vorhandene URL habe ich 404, was fair ist mit "No message available", was seltsam ist.

0
Silk0vsky