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 “productos” in result type Categoria. Did you mean “estado”?

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 “idProduco” exists in source parameter(s). Did you mean “null”?> 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 ‘com.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 ‘com.dlealmarket.persistence.mapper.ProductMapped’ in your configuration.

A mi no me funciono la inyeción de dependencia para el objeto ‘com.plazti.market.domain.service.ProductService’ me sale este error,
Field productService in com.plazti.market.web.controller.ProductController required a bean of type ‘com.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 ‘com.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 “productos” in result type Categoria. Did you mean “estado”?

o viserversa…

Solución: Agregar Getters and Setters de las variables creadas en cada clase ‘Producto 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 ‘mapper’ y usando Gradle junto con Lombok, lo resolví cambiando ‘implementation’ por ‘compileOnly’ 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 “categorias” exists in source parameter(s). Did you mean “idCategoria”?
@Mapping(source = “categorias”, target = “category”),
^
C:\Users\Luisgwolf\Desktop\ejemplo de codigos\platzi-market\src\main\java\com\platzi\market\persistence\mapper\ProductMapper.java:23: error: Unknown property “categorias” in result type Producto. Did you mean “idCategoria”?
@Mapping(source = “categorias”, target = “category”),
^
C:\Users\Luisgwolf\Desktop\ejemplo de codigos\platzi-market\src\main\java\com\platzi\market\persistence\mapper\CategoryMapper.java:21: error: Unknown property “productos” in result type Categoria. Did you mean “estado”?
@Mapping(target = “productos”, 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 ‘PlatziMarketApplication.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 ‘hibernate.dialect’ not set

Task :PlatziMarketApplication.main() FAILED

Execution failed for task ‘:PlatziMarketApplication.main()’.

Process ‘command ‘C:/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 “productos” in result type Category. Did you mean “active”?
@Mapping(target = “productos”, ignore = true)
^
Ya agregué todos los getter y setter, alguien puede ayudarme?
ademas me sale el siguiente warning in ProductMapper:
warning: Unmapped target properties: “idCategoria, descripcion, estado, productos”. Mapping from property “Category category” to “Categoria 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 ‘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.

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 “spring” la estaba “buscando” en minúscula). Por más que su notación de la clase estaba definida todo en mayúscula. -> @Table(name=“USUARIO”)

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 “java -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=“xxxxXXXX”) 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 ‘com.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 ‘com.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 “productos” in result type Category. Did you mean “active”?
@Mapping(target = “productos”, ignore = true)
^
Ya agregué todos los getter y setter, alguien puede ayudarme?
ademas me sale el siguiente warning in ProductMapper:
warning: Unmapped target properties: “idCategoria, descripcion, estado, productos”. Mapping from property “Category category” to “Categoria 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 ‘jpaMappingContext’: 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 ‘command ‘C:/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 ‘command ‘C:/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]