Antes de empezar

1

Pasos para aprender Java Spring

2

驴Java sigue siendo gratuito?

3

Instalaci贸n de ambiente de desarrollo: Linux Ubuntu

4

Instalaci贸n de ambiente de desarrollo: macOS

5

Instalaci贸n de ambiente de desarrollo: Windows

Introducci贸n a Spring boot

6

驴Qu茅 es y qu茅 usaremos de Spring?

7

Conocer qu茅 es una aplicaci贸n autocontenida

8

Crear nuestra aplicaci贸n con Spring Initializr

9

Hola mundo con Spring Boot

10

Configurar Spring Boot

11

Crear la estructura del proyecto

Spring Data

12

驴Qu茅 es JPA?

13

Conocer qu茅 es Spring Data

14

Conectar la base de datos a nuestra aplicaci贸n

15

Mapear las tablas como clases

16

Crear Entity cuando su clave primaria es compuesta

17

Mapear relaciones entre clases

18

Usar la interface CrudRepository

19

Query Methods

Construyendo nuestra API

20

Implementar la anotaci贸n @Repository

21

驴Qu茅 es el patr贸n Data Mapper y qu茅 resuelve?

22

Orientar nuestra API al dominio con MapStruct

23

Orientar nuestro repositorio a t茅rminos del dominio

24

Inyecci贸n de dependencias

25

Implementar la anotaci贸n @Service

26

Implementar la anotaci贸n @RestController

27

Exponer nuestra API

Mejorando nuestra API

28

Controlar las respuestas HTTP

29

Crear el dominio de compras

30

Mapear el dominio de compras

31

Crear el repositorio de compras

32

Probando nuestros servicios de compras

33

Documentar nuestra API con Swagger

Spring Security

34

Configurar la seguridad de nuestra API con Spring Security

35

Generar un JWT

36

Autenticaci贸n con JWT

37

Autorizaci贸n con JWT

Despliegue de nuestra aplicaci贸n

38

Desplegar nuestra API desde la ventana de comandos

39

Desplegar nuestra base de datos con Heroku

40

Desplegar nuestra API con Heroku

41

Conclusiones y despedida del curso

A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de Java Spring

Curso de Java Spring

Alejandro Ram铆rez

Alejandro Ram铆rez

Implementar la anotaci贸n @RestController

26/41
Recursos

Aportes 40

Preguntas 25

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Por si a [email protected] le aparece el error de que no reconoce el atributo categoria en la clase Producto es porque me faltaba agregar los Getter y Setter de ese atributo. Lo mismo me pas贸 que me dec铆a que no reconoc铆a el atributo productos en la clase Categoria y me salia el siguiente error:

error: Unknown property 鈥減roductos鈥 in result type Categoria. Did you mean 鈥渆stado鈥?

Es tambien porque en la clase Categoria me hac铆a falta implementar los Getter y Setter del atributo productos.

Luego de agregar estos Getter y Setter el codigo me funcion贸 correctamente. Lo comento por si a alguien le pasa lo mismo.

Alejandro buenas noches,

Tengo el siguiente error, estoy trabajando en Spring Tool Suite 4, pero no he logrado identificar donde puede estar la falla.

Field mapper in com.platzi.market.persistence.ProductoRepository required a bean of type 'com.platzi.market.persistence.mapper.ProductMapper' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.platzi.market.persistence.mapper.ProductMapper' in your configuration.

Para los que usaron lombok, si llegan a tener alg煤n error en ProductMapper, por ejemplo <No property named 鈥渋dProduco鈥 exists in source parameter(s). Did you mean 鈥渘ull鈥?> es debido a que mapstruct tiene que esperar a que lombok haga todas sus modificaciones antes de que cree las clases de mapeo. Para solucionar esto, pueden modificar el archivo build.gradle de la siguiente manera:

	// MapStruct
	compileOnly 'org.mapstruct:mapstruct:1.4.1.Final'
	annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.1.Final'

	// Lombok
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

Por si a alguno m谩s le sale el problema de:

@Mapping(target = "productos", ignore = true)
 ^

No entiendo muy bien porque, supongo que me salt茅 alg煤n momento en el curso, al crear la clase Categoria.java. Debe haber un atributo tal que as铆:

@OneToMany(mappedBy = "categoria")
    private List<Producto> productos;

Y luego a帽adirle los getter y setter a dicho atributo, adem谩s de importar su clase java.util.list.

Es curioso que a mucha gente le pase ese error, quiz谩 no se vio en los videos, o todos nos lo saltamos鈥

A mi no me funciona la inyeccion de dependias, descargue el proyecto y me sale el mismo error en la clase ProductMapped. Alguien sabe como solucionarlo ?

Description:
Field mapper in com.dlealmarket.persistence.ProductoRepository required a bean of type 鈥榗om.platzi.market.persistence.mapper.ProductMapped鈥 that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 鈥榗om.dlealmarket.persistence.mapper.ProductMapped鈥 in your configuration.

A mi no me funciono la inyeci贸n de dependencia para el objeto 鈥榗om.plazti.market.domain.service.ProductService鈥 me sale este error,
Field productService in com.plazti.market.web.controller.ProductController required a bean of type 鈥榗om.plazti.market.domain.service.ProductService鈥 that could not be found.

The injection point has the following annotations:

  • @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 鈥榗om.plazti.market.domain.service.ProductService鈥 in your configuration.

Alguien sabe por que, si instancio normalmente la clase funciona

Tengo el siguiente error

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productoCrudRepository' defined in com.platzi.market.persistence.crud.ProductoCrudRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to asynchronously initialize native EntityManagerFactory: java.lang.StackOverflowError

  • @RestController

Denota una clase controladoras de una API REST

  • ResquestMapping("/path")

Marca el path bajo el cual va a responder la API

Tengo mi proyecto con maven y me arroja el siguiente error,

Description:

Field productMapper in io.maya.platzimarket.persistance.ProductRepository required a bean of type 'io.maya.platzimarket.persistance.mapper.ProductMapper' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'io.maya.platzimarket.persistance.mapper.ProductMapper' in your configuration.

Descargue el plugin a IntelliJ como le铆 en otro comentario y me muestra de todos modos el error en la inyecci贸n de dependencias, yo no escrib铆 tal cual las entidades en espa帽ol, yo lo inicie desde un inicio en ingles, por lo cual cre铆 que hab铆a tenido un error en la parte de los mappers y si lo ten铆a pero (seg煤n yo) ya lo correg铆, dejo el link a mi repo de gitlab por si alguien tuvo el mismo error y pudo corregirlo https://gitlab.com/espinokatsuki/platzi-market . Muchas gracias 馃檹

Desde la clase anterior estoy emocionado por exponer la api 馃槂

Error: Unknown property 鈥減roductos鈥 in result type Categoria. Did you mean 鈥渆stado鈥?

o viserversa鈥

Soluci贸n: Agregar Getters and Setters de las variables creadas en cada clase 鈥楶roducto y Categoria鈥

Lo que sucedi贸 es que el profesor agreg贸 estas variables luego de aplicar Getters y Setters, por eso nosotros tuvimos el error, no aplicamos tambipen sus Getters y Setters por andar de copiones nada m谩s jajajaj

A los que les genera el siguiente error :

Me faltaban las siguientes lineas de c贸digo en estos arhivos :

com/platzi-market/market/persistence/entity/Categoria.java

   public List<Producto> getProductos() {
        return productos;
    }

    public void setProductos(List<Producto> productos) {
        this.productos = productos;
    }

java/com/platzi-market/market/persistence/entity/Producto.java

public Categoria getCategoria() {
       return categoria;
   }

   public void setCategoria(Categoria categoria) {
       this.categoria = categoria;
   }

Los que tengan problemas con las clases 鈥榤apper鈥 y usando Gradle junto con Lombok, lo resolv铆 cambiando 鈥榠mplementation鈥 por 鈥榗ompileOnly鈥 y me va todo genial!

Simplemente lo organic茅 as铆.

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

compileOnly 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

Todo compila y no tengo problemas con las anotaciones Getter ni Setter.

Fuente: https://github.com/mapstruct/mapstruct

Tuve errores por codificaci贸n hasta que le di. puf!! esto me sirvi贸 para ver como funciona mi API, creo que ahi la llevo 馃槂

hola a todos necesito ayuda, me ocurre lo siguiente

Task :compileJava
C:\Users\Luisgwolf\Desktop\ejemplo de codigos\platzi-market\src\main\java\com\platzi\market\persistence\mapper\ProductMapper.java:23: error: No property named 鈥渃ategorias鈥 exists in source parameter(s). Did you mean 鈥渋dCategoria鈥?
@Mapping(source = 鈥渃ategorias鈥, target = 鈥渃ategory鈥),
^
C:\Users\Luisgwolf\Desktop\ejemplo de codigos\platzi-market\src\main\java\com\platzi\market\persistence\mapper\ProductMapper.java:23: error: Unknown property 鈥渃ategorias鈥 in result type Producto. Did you mean 鈥渋dCategoria鈥?
@Mapping(source = 鈥渃ategorias鈥, target = 鈥渃ategory鈥),
^
C:\Users\Luisgwolf\Desktop\ejemplo de codigos\platzi-market\src\main\java\com\platzi\market\persistence\mapper\CategoryMapper.java:21: error: Unknown property 鈥減roductos鈥 in result type Categoria. Did you mean 鈥渆stado鈥?
@Mapping(target = 鈥減roductos鈥, ignore = true)
^
3 errors

Task :compileJava FAILED
1 actionable task: 1 executed

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task 鈥:compileJava鈥.

Compilation failed; see the compiler error output for details.

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 2s
10:04:15: Task execution finished 鈥楶latziMarketApplication.main()鈥.

estoy corriendo el proyecto y me genera errores :

Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 鈥榟ibernate.dialect鈥 not set

Task :PlatziMarketApplication.main() FAILED

Execution failed for task 鈥:PlatziMarketApplication.main()鈥.

Process 鈥榗ommand 鈥楥:/Program Files/AdoptOpenJDK/jdk-11.0.8.10-hotspot/bin/java.exe鈥欌 finished with non-zero exit value 1

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

este es mi repositorio: https://github.com/konkerdavid/plsatzi-markjet

Buenas tardes,
Alguien me puede ayudar con estos errores?

me salen los siguientes errores en CategoryMapper:
Cycle detected while evaluating inherited configurations. Inheritance path: com.platzi.market.domain.Category toCategoria(com.platzi.market.domain.Category category) -> com.platzi.market.domain.Category toCategoria(com.platzi.market.domain.Category category)
Category toCategoria(Category category);

Unknown property 鈥減roductos鈥 in result type Category. Did you mean 鈥渁ctive鈥?
@Mapping(target = 鈥減roductos鈥, ignore = true)
^
Ya agregu茅 todos los getter y setter, alguien puede ayudarme?
ademas me sale el siguiente warning in ProductMapper:
warning: Unmapped target properties: 鈥渋dCategoria, descripcion, estado, productos鈥. Mapping from property 鈥淐ategory category鈥 to 鈥淐ategoria categoria鈥.
Producto toProducto(Product product);
^

Mil gracias

Buenas tardes, se me presenta el mismo error que a todos y no encuentro soluci贸n. El error es el siguiente:
Description:

Field mapper in com.platzi.market.persistence.ProductoRepository required a bean of type 鈥榗om.platzi.market.persistence.mapper.ProductMapper鈥 that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 鈥榗om.platzi.market.persistence.mapper.ProductMapper鈥 in your configuration.

Mi c贸digo fuente se encuentra en: https://github.com/yampier0213/platziSpringBoot

Quedo atento a cualquier comentario.

Hola! Les comparto esto por si a alguien le pasa lo que a m铆 me pas贸.

Notas previas:

  1. En mi caso, lo estoy haciendo con un ejercicio planteado por m铆.
  2. Mi base de datos es MariaDB.
  3. Estoy usando Gradle, en vez de maven.

Situaciones:

  1. Al querer desplegar mi aplicaci贸n me sali贸 el siguiente mensaje de error:
Field mapper in com.dberrospi.xpresate.persistence.UserRepository required a bean of type 'com.dberrospi.xpresate.persistence.mapper.UserMapper' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.dberrospi.xpresate.persistence.mapper.UserMapper' in your configuration.
  1. Las tablas de mi base de datos est谩n en may煤scula y al querer insertar un registro me sal铆a que la tabla no exist铆a(Porque 鈥渟pring鈥 la estaba 鈥渂uscando鈥 en min煤scula). Por m谩s que su notaci贸n de la clase estaba definida todo en may煤scula. -> @Table(name=鈥淯SUARIO鈥)

Soluciones:

  1. El IDE que utilizo es eclipse, no llegu茅 a encontrar una soluci贸n para poder ejecutarlo ah铆 mismo. Lo que hice fue validar las dependencias desde la misma documentaci贸n de Gradle. Siendo estas las siguientes:
implementation 'org.mapstruct:mapstruct:1.5.0.RC1'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.0.RC1'

Luego, proced铆 a compilarlo y ejecutarlo por fuera de eclipse. Utilic茅 el comando 鈥./gradlew build鈥 en la ra铆z del proyecto(previo a un 鈥./gradlew clean鈥).
Por 煤ltimo, lo ejecute con el comando 鈥渏ava -jar ./build/libs/app.jar鈥 desde la ra铆z del proyecto y listo, por la terminal no sale ese error.

  1. Para que la base de datos respete el sensitiveCase de la notaci贸n @Table(name=鈥渪xxxXXXX鈥) le agregu茅 la siguiente propiedad en el archivo application.properties:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Viniendo de Django me parece una locura tener que escribir todo este c贸digo para hacer un simple CRUD, pero bueno imagino que las ventajas a nivel de rendimiento y robustez de la aplicaci贸n lo justifican.

Para todos los que les sale error al compilar use el intellij ide , sino estaran como yo buscando una solucion para vscode :,c

Otra cosnulta por que no usa en el service @transactional para delete y save?

Para los que usan lombok y mapstruct les dejo la soluci贸n:

https://github.com/mapstruct/mapstruct-examples/blob/master/mapstruct-lombok/pom.xml

Error! Alguna idea?

Me sale este error, no se que pueda ser

![](

Yo estaba utilizando las anotaciones de Lombok (@Getter y @Setter) para ahorrar c贸digo. Pero al compilar la aplicaci贸n; las clases Mapper marcaban error. As铆 que tuve que quitar las anotaciones y generar los Getter y Setters manualmente y solo as铆 compil贸.
驴Alguien sabe porque no se pueden utilizar dichas anotaciones con las anotaciones Mapper? 馃

Alguien me ayudar铆a :

APPLICATION FAILED TO START


Description:

Field mapper in com.prueba.Proyecto1.persistence.productoRepository required a bean of type 鈥榗om.prueba.Proyecto1.persistence.mapper.productMapper鈥 that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 鈥榗om.prueba.Proyecto1.persistence.mapper.productMapper鈥 in your configuration.

Tengo una duda, cuando cree un proyecto similar, en una de las clases me exig铆a implementar Serializable

@Entity
public class Act_Tension_Mental implements Serializable {
 @Id
 @ManyToOne
 @JoinColumn(name = "id_act",insertable = false, updatable = false)
 private Actividad actividad_tm;

Esta clase tiene el id como clave primaria y a su vez es una clave for谩nea.
Esta correcto esto?

me salen los siguientes errores en CategoryMapper:
Cycle detected while evaluating inherited configurations. Inheritance path: com.platzi.market.domain.Category toCategoria(com.platzi.market.domain.Category category) -> com.platzi.market.domain.Category toCategoria(com.platzi.market.domain.Category category)
Category toCategoria(Category category);

Unknown property 鈥減roductos鈥 in result type Category. Did you mean 鈥渁ctive鈥?
@Mapping(target = 鈥減roductos鈥, ignore = true)
^
Ya agregu茅 todos los getter y setter, alguien puede ayudarme?
ademas me sale el siguiente warning in ProductMapper:
warning: Unmapped target properties: 鈥渋dCategoria, descripcion, estado, productos鈥. Mapping from property 鈥淐ategory category鈥 to 鈥淐ategoria categoria鈥.
Producto toProducto(Product product);
^

context-path

Este error.

me sale el mensaje:
main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
se supone que todo esta bien鈥
Pero en la pesta帽a de project se marcan de rojo los siguientes archivos:
-MiProjectMarketApplication
-application.properties
-application-dev.properties
-application-pdn.properties
-MiProjectMarketApplication (de la carpeta Java->com.MiProject.market)
-gitignore
-build.gradle
-gradlew
-gradlwe.bat
-settings.gradle

es normal?

Alejandro una cosnulta que diferencia hay en poner el AUTOWIRED con poner un constructor , yo he hecho app sin el autowired usando el constructor el IoC de spring lo instancio automaticamente.
Hayun curso de spring y hibernate dentr de platzi que se parece al de usted pero lo que me gusto de usted hasta ahora es el uso de mapper para asi no exponer los entities que me parece mucho acoplamiento.

un atajo interesante para borrar importaciones que no se usan es usar las teclas ctrl + shift + o con esto se limpiaremos la clase en la que estemos trabajando

ayuda con estos 3 errorres

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 鈥榡paMappingContext鈥: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.platzi.market.persistence.entity.ComprasProducto.productos in com.platzi.market.persistence.entity.Compra.productos

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.platzi.market.persistence.entity.ComprasProducto.productos in com.platzi.market.persistence.entity.Compra.productos

Execution failed for task 鈥:PlatziMarketApplication.main()鈥.

Process 鈥榗ommand 鈥楥:/Program Files/AdoptOpenJDK/jdk-11.0.9.11-hotspot/bin/java.exe鈥欌 finished with non-zero exit value 1

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

A mi no me esta funcionando por lo siguiente, alguien sabe como se resuelve?

  • What went wrong:
    Execution failed for task 鈥:PlatziMarketApplication.main()鈥.

Process 鈥榗ommand 鈥楥:/Program Files/AdoptOpenJDK/jdk-11.0.8.10-hotspot/bin/java.exe鈥欌 finished with non-zero exit value 1

Validar ejecuci贸n

Significado de la anotacion @RestController

Alguno le salio este error?

error: incompatible types: Optional<Producto> cannot be converted to Optional<List<Producto>>
Optional<List<Producto>> productos = productoCrudRepository.findByCantidadStockLessThanAndEstado(quantity, true);

en ProductoRepository

Corr铆 la aplicaci贸n, y al intentar cargar el URL del api me sali贸 el siguiente mensaje en la consola:

java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x020x000x010x000x010xfc0x030x030x860xa50x090xde0x19Y0xfb0xde0xef0x11l_0x0fVZ0x9e0xb40x9c?U0x1a0xb70xe70xd70xa90x02%0xf6A-0xdeP]. HTTP method names must be tokens
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:417) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]