web-dev-qa-db-fra.com

Problème avec ressort: une erreur inattendue s'est produite (type = introuvable, statut = 404)

Je suis en train de parcourir ce livre sur des services Web reposants avec le printemps. J'ai décidé de m'éloigner de ce qu'ils faisaient et d'utiliser des fichiers de configuration Java. Pour une raison quelconque, après le basculement vers la configuration Java, le service s'exécutait correctement (dans la fenêtre de la console), mais lorsque j'accède au terminal sur localhost, j'obtiens ceci:

Étiquette blanche page d'erreur

Cette application n'a pas de mappage explicite pour/error, vous voyez donc ceci comme un repli.

Sam 23 avr 20:48:25 PDT 2016 Une erreur inattendue s'est produite (type = Non Trouvé, statut = 404). Aucun message disponible

Et voici la réponse de la demande GET:

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

Le chapitre suivant de cette histoire commence par mon passage à la page de démarrage du site Web de Spring http://spring.io/guides/gs/rest-service/ J'ai décidé de lancer un petit projet recréant leur didacticiel de base. . Je vais poster le code que j'ai écrit ci-dessous pour que vous puissiez le voir. Le problème est que j'ai exactement le même problème. Le service fonctionne mais je ne peux pas atteindre les terminaux. Je ne suis pas sûr de ce qui se passe et j'en ai vu d'autres avec des problèmes similaires, mais les réponses n'ont pas été appliquées/aidées avec les miennes. Je suis sûr que c'est une évidence que je me trompe et toute aide serait grandement appréciée. Un dernier élément d’information, le cas échéant, j’utilise IntelliJ IDEA 15 CE comme IDE. 

Le point final étant touché:

http: // localhost: 8080/greeting

Mon contrôleur 

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

        @RequestMapping("/greeting")
        public Greeting greeting(@RequestParam(value = "name", defaultValue = "World")String name)
        {
            return new Greeting(counter.incrementAndGet(), String.format(template, name));
        }
    }

Ma classe de représentation des ressources

 public class Greeting
    {
        private final long id;
        private final String content;

        public Greeting(long id, String content)
        {
            this.id = id;
            this.content = content;
        }

        public long getId()
        {
            return id;
        }

        public String getContent()
        {
            return content;
        }
    }

Mon principal

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

Mon fichier POM

<?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>com.organization_name.webservices</groupId>
<artifactId>helloworld</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.3.RELEASE</version>
</parent>

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

<properties>
    <Java.version>1.8</Java.version>
</properties>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </pluginRepository>
</pluginRepositories>

Ligne de commande à exécuter

mvn spring-boot:run   

Mon journal complet depuis la console

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.3.3.RELEASE)

2016-04-23 20:47:53.153  INFO 7898 --- [           main] c.t.webservices.application.Application  : Starting Application on Macintosh.local with PID 7898 (/Users/<my_user>/Downloads/B04788_Code/HelloWorld/target/classes started by <my_user> in /Users/<my_user>/Downloads/B04788_Code/HelloWorld)
2016-04-23 20:47:53.156  INFO 7898 --- [           main] c.t.webservices.application.Application  : No active profile set, falling back to default profiles: default
2016-04-23 20:47:53.242  INFO 7898 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68ceda24: startup date [Sat Apr 23 20:47:53 PDT 2016]; root of context hierarchy
2016-04-23 20:47:54.084  INFO 7898 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: 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]]
2016-04-23 20:47:54.811  INFO 7898 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2016-04-23 20:47:54.840  INFO 7898 --- [           main] o.Apache.catalina.core.StandardService   : Starting service Tomcat
2016-04-23 20:47:54.841  INFO 7898 --- [           main] org.Apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.32
2016-04-23 20:47:54.960  INFO 7898 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2016-04-23 20:47:54.960  INFO 7898 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1736 ms
2016-04-23 20:47:55.214  INFO 7898 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2016-04-23 20:47:55.218  INFO 7898 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2016-04-23 20:47:55.219  INFO 7898 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2016-04-23 20:47:55.219  INFO 7898 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2016-04-23 20:47:55.219  INFO 7898 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'requestContextFilter' to: [/*]
2016-04-23 20:47:55.545  INFO 7898 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68ceda24: startup date [Sat Apr 23 20:47:53 PDT 2016]; root of context hierarchy
2016-04-23 20:47:55.605  INFO 7898 --- [           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)
2016-04-23 20:47:55.606  INFO 7898 --- [           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,javax.servlet.http.HttpServletResponse)
2016-04-23 20:47:55.628  INFO 7898 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-04-23 20:47:55.628  INFO 7898 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-04-23 20:47:55.657  INFO 7898 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-04-23 20:47:55.776  INFO 7898 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-04-23 20:47:55.848  INFO 7898 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-04-23 20:47:55.853  INFO 7898 --- [           main] c.t.webservices.application.Application  : Started Application in 3.531 seconds (JVM running for 4.702)
2016-04-23 20:48:19.521  INFO 7898 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2016-04-23 20:48:19.521  INFO 7898 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2016-04-23 20:48:19.533  INFO 7898 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 12 ms

Mise à jour de la console après la requête GET

2016-04-23 20:48:19.521  INFO 7898 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2016-04-23 20:48:19.533  INFO 7898 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 12 ms

Console après l'arrêt

2016-04-23 20:53:24.494  INFO 7898 --- [       Thread-2] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68ceda24: startup date [Sat Apr 23 20:47:53 PDT 2016]; root of context hierarchy
2016-04-23 20:53:24.495  INFO 7898 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

Process finished with exit code 130

Merci encore pour toute aide que vous pouvez offrir. Je tiendrai tout le monde au courant des mises à jour!

19
tramstheman

Je crois que votre problème est lié aux paquets. Votre application est définie dans com.organization_name.webservices.application. Je devine que vos autres classes sont dans un paquet différent qui n'est pas un enfant de com.organization_name.webservices.application. Spring chargera automatiquement les contrôleurs situés dans le même package ou sous-package, par exemple:

com.organization_name.webservices.application
com.organization_name.webservices.application.controllers

Mais pas les paquets comme celui-ci:

com.organization_name.webservices.controllers

Vous pouvez résoudre ce problème en déplaçant votre contrôleur (ou votre application) ou en ajoutant ComponentScan à votre application:

@SpringBootApplication
@ComponentScan(basePackageClasses=GreetingController.class)
public class Application {

Vous devriez voir ceci dans votre journal:

 Mapped "{[/greeting]}" onto public com.organization_name.webservices.xxx.Greeting com.organization_name.webservices.xxx.GreetingController.greeting(Java.lang.String)
44
markwatsonatx

dans pom.xml ajouter la dépendance suivante

     <dependency>
        <groupId>org.Apache.Tomcat.embed</groupId>
        <artifactId>Tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
1
SAN