tutorial servicios restful restcontroller responsebody requestmapping example espaƱol entre ejemplo diferencia java spring maven package spring-restcontroller

java - servicios - spring rest json



@RestController en otro paquete no funciona (7)

Empiezo con Learning Spring y creo un proyecto básico que crea una base de datos, inserto valores y luego lo imprimo en el navegador web. Mi problema es que cuando tengo RestController en el mismo paquete que la clase principal, está bien, pero quiero distribuirlo a otro paquete y cuando creo un nuevo paquete, mover RestController no funciona. Dejemos que te explique

Mi proyecto se ve como:

|-Springtestv_01 |-src/main/java |--com.person <-- it''s a main package |-Main.java |-Person.java |-PersonLineRunner.java |-PersonRepository.java |-PersonController.java |-com.controller <-- second package, I want put here PersonController.java |-src/main/resources |-data.sql pom.xml

Mi controlador se ve:

@RestController public class PersonController { @Autowired PersonRepository personRepository; @RequestMapping("/persons") Collection<Person> persons(){ return this.personRepository.findAll(); } }

Cuando todo está en el paquete com.person , escribo en el navegador web http://localhost:8080/persons y funciona correctamente ... Pero quiero mover PersonController.java al paquete com.controller , y cuando lo moví, mi los webbrowers me llaman

Se produjo un error inesperado (tipo = No encontrado, estado = 404). No hay mensajes disponibles

y no tengo idea de lo que debo hacer para repararlo. Tal vez debería cambiar algo en mi pom.xml ??

Mi pom.xml se parece a

<?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.person</groupId> <artifactId>person</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringTest_v0_1</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>com.h2database</groupId><artifactId>h2</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-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId> spring-boot-starter-data-elasticsearch </artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project>

Se genera automáticamente, escribo solo una dependencia.

<dependency> <groupId>com.h2database</groupId><artifactId>h2</artifactId> </dependency>


Como el que tuvo problemas con el problema, si encontró que la solución proporcionada no funcionó.
Compruebe si coloca los archivos de origen en el nivel raíz directamente, por ejemplo,
src/main/java/xxx.java

Tiene un efecto negativo para proyectar pero no conozco la causa raíz. De todas formas,

src/main/java/pack1/xxx.java archivos de origen en al menos un paquete creado por sí mismo como: src/main/java/pack1/xxx.java

Intente otra configuración otra vez. Resolvió mi problema.


Podemos usar @ComponentScan (basePackages = {"include your package name here"}) .

Además, si tiene algún formato de nombre de paquete común, entonces podemos incluir solo una parte común del nombre del paquete con * como @ComponentScan(basePackages = { "com.*"} , Para que todos los paquetes que tengan ese nombre de paquete común sean escaneados.


Solo define un nombre de paquete en @ComponentScan como:

@SpringBootApplication @ComponentScan({"com.project.pck_name"}) public class MainClassHome { public static void main(String[] args) { SpringApplication.run(MainClassHome.class, args); } }

y actualice el proyecto después de eso: - haga clic con el botón derecho en Su proyecto -> maven -> actualice el proyecto


Tuve el mismo problema, las respuestas proporcionadas aquí funcionaron para mí, pero tuve que agregar otra anotación de primavera y es más general en el caso de que se trate de una gran cantidad de repositorios. Tenemos la siguiente estructura:

|-src/main/java |--com.person |--repositories |--controllers |--...

Esto entonces debe ser agregado en el principal

@SpringBootApplication(scanBasePackages = {"com.person"}) @EnableMongoRepositories(basePackages = "com.person.repositories") public class MainDemoApplication { // }


Tuve el mismo problema, pero de repente descubrí que mi clase Application.java (la clase con el método principal y la anotación @SpringBootApplication) se encontraba en un paquete diferente pero paralelo con la clase @Controller.

La cuestión es que la clase Application.java debe estar en la misma posición o encima de todos los demás paquetes, entonces no necesitamos ningún @ComponentScan y todos los beans se escanearán automáticamente. Por ejemplo: si Application.java se encuentra en com.person y todos los beans de aplicación ubicados en com.person, entonces funcionará sin @ComponentScan.


Usar una anotación @SpringBootApplication es equivalente a usar @Configuration , @EnableAutoConfiguration y @ComponentScan .

De la documentación:

ComponentScan configura las directivas de exploración de componentes para su uso con las clases de configuración. Proporciona soporte paralelo con el elemento de Spring XML.

Se puede especificar uno de basePackageClasses (), basePackages () o su valor de alias () para definir paquetes específicos para analizar. Si los paquetes específicos no están definidos, la exploración ocurrirá desde el paquete de la clase con esta anotación.

Puede moverlo como lo hizo o especificar basePackages en @ComponentScan .


Utilice los paquetes base:

@ComponentScan(basePackages = { "com.person","com.controller"} )