J'essaie de mettre en œuvre une application de démonstration MVC simple avec Spring Boot, mais je reçois une erreur 404 lors de l'exécution de l'application. L'URI est ` http: // localhost: 8080/ 'qui consiste à afficher toutes les lignes d'une table appelée cercle.
Projet Maven Java:
Application.Java
package com.nomad.dubbed.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
CircleController.Java
package com.nomad.dubbed.controller;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.nomad.dubbed.dao.CircleService;
import com.nomad.dubbed.model.Circle;
@RestController
@RequestMapping("/")
public class CircleController {
@Autowired
private CircleService circleService;
@RequestMapping(method=RequestMethod.GET)
public List<Circle> getAll() {
return circleService.getAll();
}
}
CircleRepository.Java
package com.nomad.dubbed.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.nomad.dubbed.model.Circle;
@Repository
public interface CircleRepository extends JpaRepository<Circle, Integer> {
}
CircleService.Java
package com.nomad.dubbed.dao;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.nomad.dubbed.model.Circle;
@Service
public class CircleService {
@Autowired
private CircleRepository circleRepository;
@Transactional(propagation=Propagation.REQUIRED)
public List<Circle> getAll(){
return circleRepository.findAll();
}
}
Circle.Java
package com.nomad.dubbed.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="circle")
public class Circle {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
public Circle(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
application.properties
spring.datasource.url=jdbc:derby://localhost:1527/db
spring.datasource.driverClassName=org.Apache.derby.jdbc.ClientDriver
logging.level.org.springframework.web:DEBUG
logging.level.org.hibernate:DEBUG
pom.xml
<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.nomad.dubbed</groupId>
<artifactId>spring-boot-mvc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<derby-client.version>10.11.1.1</derby-client.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-Shell</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.Apache.derby</groupId>
<artifactId>derbyclient</artifactId>
<version>${derby-client.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>spring-boot-mvc</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
La base de données est opérationnelle, il y a 5 lignes dans le cercle de table:
L'URI par défaut (/ beans,/health ..) fonctionne bien mais le contrôleur implémenté n'est pas reconnu. Il n'y a pas d'erreur de ce type affichée dans la console, ci-dessous est le dump des journaux imprimés dans la console après l'envoi de la demande.
2016-05-03 14:17:26.594 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/]
2016-05-03 14:17:26.596 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /
2016-05-03 14:17:26.596 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/]
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/] are [/**]
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/] are {}
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@6c13019c]]] and 1 interceptor
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/] is: -1
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Successfully completed request
2016-05-03 14:17:26.597 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error]
2016-05-03 14:17:26.600 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error
2016-05-03 14:17:26.600 DEBUG 659 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]
2016-05-03 14:17:26.600 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/error] is: -1
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html])
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@2f5f8d71] based on requested media type 'text/html'
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Rendering view [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@2f5f8d71] in DispatcherServlet with name 'dispatcherServlet'
2016-05-03 14:17:26.601 DEBUG 659 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Successfully completed request
utilisez une autre URL pour votre contrôleur. "/" dans spring-boot mappe les ressources statiques situées dans META-INF/resources et src/main/resources/static /.
edit: oubliez ci-dessus et procédez comme suit dans votre classe d'application:
Application.Java
package com.nomad.dubbed.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@ComponentScan("com.nomad.dubbed")
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
votre contrôleur de repos n'est pas découvert par le scan de composant spring-boots. selon cette doc http://docs.spring.io/spring-boot/docs/current/reference/html/ … spring analyse les packages situés sous le package contenant la classe avec l'annotation @SpringBootApplication. votre contrôleur est situé dans un paquet parallèle.
Je dois rechercher plus en détail pourquoi spring-boot n'a pas réussi à reconnaître le contrôleur avec la structure de package d'origine. J'ai vidé toutes les classes Java dans un package et j'ai finalement lancé le projet de démonstration.
Structure de projet Java modifiée:
La classe CircleController.Java a également été modifiée. J'ai tous les enregistrements supprimés de la table de cercle sans mentionner la méthode de requête spécifique, method=RequestMethod.GET
.
package com.nomad.dubbed.app;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CircleController {
@Autowired
private CircleService circleService;
@RequestMapping(value="/circles", method=RequestMethod.GET)
public List<Circle> getAll() {
return circleService.getAll();
}
}
Pourriez-vous essayer d'ajouter l'annotation @ResponseBody
@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public List<Circle> getAll() {
return circleService.getAll();
}
J'ai eu le même problème et j'ai ajouté @ComponentScan (basePackages = "package.name") dans la classe Application. Après cela, mon contrôleur de repos a été reconnu.
package com.nomad.dubbed.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@ComponentScan(basePackages = "com.spring.basepkg")
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}