web-dev-qa-db-fra.com

Obtenir l'erreur "Aucun message disponible" avec Spring Boot + REST application

J'ai créé le projet de démonstration Spring Boot et mis en œuvre des services Restful comme indiqué ici. 

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

Lorsque j'ai essayé d'appeler le service avec l'outil Postman avec l'URL " http: // localhost: 8080/api/greetings " comme méthode de requête GET, le message d'erreur ci-dessous s'affiche

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

Pour chaque application Spring Boot, je n'ai pas à configurer le servlet Spring Dispatcher dans le fichier web.xml.

Quelqu'un peut-il m'aider à découvrir le point manquant ici? 

8
Naveen

Vous manquez probablement @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 inclut @ComponentScan qui analyse le package dans lequel il se trouve et tous les packages enfants. Votre contrôleur ne peut être dans aucun d'entre eux.

7
cahen

Trois solutions possibles:

1) Assurez-vous que le fichier YourController.Java contenant le @Controller et le fichier YourSpringBootFile.Java contenant le @SpringBootApplication se trouvent dans le même package. 

Par exemple, c'est faux:  enter image description here

C'est le bon chemin:  enter image description here

Alors vous savez de quoi je parle, voici mon fichier WebController.Java: 

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

Voici mon JsonPostExampleProj1Application.Java:

@SpringBootApplication
public class JsonPostExampleProj1Application {

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

2) Si vous souhaitez que votre contrôleur soit dans un package différent de celui de YourSpringBootFile.Java, suivez ces instructions = Spring: exécutez plusieurs "SpringApplication.Run ()" dans la méthode principale de l'application

3) Essayez d’utiliser @RestController au lieu de @Controller au-dessus de votre classe de contrôleur.

3
Gene

Si vous utilisez @SpringBootApplication seul, assurez-vous que votre contrôleur de services de repos est dans le même package que ci-dessous - 

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

Si vous utilisez @ComponentScan(basePackageClasses = UserController.class), mentionnez des noms de classe de contrôleur spécifiques. 

Mis à part l’annotation du point d’entrée SpringBoot avec @SpringBootApplication((scanBasePackages = "com.duwamish.x.y") afin qu’il inclue tous les composants/beans du ressort lors de son initialisation 

Le contextPath doit également être correct. Si l'application est déployée sur Tomcat avec le nom d'application myapplication, voir ci-dessous, 

$ 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

Ensuite, le point de terminaison REST serait /myapplication/api/greetings

Mais si l'application war est déployée en tant que ROOT, la ressource de noeud final sera /api/greetings uniquement.

2
prayagupd

Dans mon cas, j'ai appelé le mauvais chemin via un ruban.

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

}

Le service currency-exchange à distance n'avait pas de gestionnaire pour le chemin /exchange/{from}/to/{to}.

Donc pour l'URL inexistante, j'ai 404, ce qui est juste avec "Aucun message disponible", ce qui est étrange.

0
Silk0vsky