Curso de Java Spring

Clases del Curso de Java Spring

Instruido por:
Alejandro Ramírez
Alejandro Ramírez
Avanzado
5 horas de contenido
Ver la ruta de aprendizaje
Platzi Market
Proyecto del curso
Platzi Market

Controla las operaciones de un supermercado a través de una API con Java Spring. Empieza conectándote a una base de datos, crea todos los servicios para manejar tus productos y finalmente despliega tu aplicación para ser consumida.

Curso de Java Spring

Curso de Java Spring

Progreso del curso:0/41contenidos(0%)

Contenido del Curso
Tutoriales de estudiantes
Preguntas de estudiantes

Progreso del curso:0/41contenidos(0%)

Antes de empezar

Material Thumbnail

Pasos para aprender Java Spring

01:38 min

Material Thumbnail

¿Java sigue siendo gratuito?

03:25 min

Instalación de ambiente de desarrollo: Linux Ubuntu

02:39 min

Instalación de ambiente de desarrollo: macOS

03:47 min

Instalación de ambiente de desarrollo: Windows

03:46 min

Introducción a Spring boot

Material Thumbnail

¿Qué es y qué usaremos de Spring?

03:29 min

Material Thumbnail

Conocer qué es una aplicación autocontenida

02:25 min

Material Thumbnail

Crear nuestra aplicación con Spring Initializr

06:12 min

Material Thumbnail

Hola mundo con Spring Boot

07:47 min

Material Thumbnail

Configurar Spring Boot

08:06 min

Material Thumbnail

Crear la estructura del proyecto

05:20 min

Spring Data

Material Thumbnail

Conocer qué es Spring Data

05:24 min

Material Thumbnail

Conectar la base de datos a nuestra aplicación

12:40 min

Material Thumbnail

Mapear las tablas como clases

14:00 min

Material Thumbnail

Crear Entity cuando su clave primaria es compuesta

06:49 min

Material Thumbnail

Mapear relaciones entre clases

10:37 min

Material Thumbnail

Usar la interface CrudRepository

07:54 min

Construyendo nuestra API

Material Thumbnail

Implementar la anotación @Repository

05:19 min

Material Thumbnail

¿Qué es el patrón Data Mapper y qué resuelve?

13:37 min

Orientar nuestra API al dominio con MapStruct

11:22 min

Material Thumbnail

Orientar nuestro repositorio a términos del dominio

09:27 min

Material Thumbnail

Inyección de dependencias

05:16 min

Material Thumbnail

Implementar la anotación @Service

09:12 min

Material Thumbnail

Implementar la anotación @RestController

07:14 min

Material Thumbnail

Exponer nuestra API

09:25 min

Mejorando nuestra API

Material Thumbnail

Controlar las respuestas HTTP

09:18 min

Material Thumbnail

Crear el dominio de compras

05:27 min

Material Thumbnail

Mapear el dominio de compras

10:45 min

Material Thumbnail

Crear el repositorio de compras

09:01 min

Material Thumbnail

Probando nuestros servicios de compras

02:56 min

Material Thumbnail

Documentar nuestra API con Swagger

13:00 min

Spring Security

Material Thumbnail

Configurar la seguridad de nuestra API con Spring Security

08:55 min

Material Thumbnail

Autenticación con JWT

11:16 min

Material Thumbnail

Autorización con JWT

14:34 min

Despliegue de nuestra aplicación

Material Thumbnail

Desplegar nuestra API desde la ventana de comandos

07:50 min

Material Thumbnail

Desplegar nuestra base de datos con Heroku

07:43 min

Material Thumbnail

Desplegar nuestra API con Heroku

07:38 min

Material Thumbnail

Conclusiones y despedida del curso

01:07 min

nuevosmás votadossin responder
Alejandro Manzano
Alejandro Manzano
Estudiante

No puedo guardar nuevos ítems, sino mando el product id me da un nullPointer Exception, algun consejo sobre esto, les comparto mi log.

java.lang.NullPointerException: null
	at com.manzano.market.dominio.Product.getIdProduct(Product.java:14) ~[main/:na]
	at com.manzano.market.persistencia.Mapeador.ProductMapperImpl.toProducto(ProductMapperImpl.java:69) ~[main/:na]
	at com.manzano.market.persistencia.ProductoRepository.save(ProductoRepository.java:53) ~[main/:na]
	at com.manzano.market.persistencia.ProductoRepository$$FastClassBySpringCGLIB$$85ee101.invoke(<generated>) ~[main/:na]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.8.jar:5.3.8]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) ~[spring-aop-5.3.8.jar:5.3.8]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.8.jar:5.3.8]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.8.jar:5.3.8]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.8.jar:5.3.8]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar:5.3.8]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.8.jar:5.3.8]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) ~[spring-aop-5.3.8.jar:5.3.8]
	at com.manzano.market.persistencia.ProductoRepository$$EnhancerBySpringCGLIB$$b00bbd5f.save(<generated>) ~[main/:na]
	at com.manzano.market.dominio.servicio.ProductService.save(ProductService.java:30) ~[main/:na]
	at com.manzano.market.web.ProductController.save(ProductController.java:35) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.8.jar:5.3.8]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.46.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.8.jar:5.3.8]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.46.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.8.jar:5.3.8]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar:5.3.8]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.8.jar:5.3.8]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar:5.3.8]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.8.jar:5.3.8]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar:5.3.8]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
	at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
1
Alejandro Manzano
Alejandro Manzano
Estudiante

Alguien me puede ayudar con el siguiente error:

Execution failed for task ‘:MarketApplication.main()’.
Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.manzano.market.persistencia.entidad.Compra.producto

Lo que hay en mi clase Compra seria:

@Entity
@Table(name = “compras”)
public class Compra {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_compra")
private Integer idCompra;

@Column(name = "id_cliente")
private String idCliente;

private LocalDateTime fecha;

@Column(name = "medio_pago")
private String medioPago;

private String comentario;

private String estado;

@ManyToOne
@JoinColumn(name = "id_cliente", insertable = false, updatable = false)
private Cliente cliente;

public CompraProducto getProducto() {
    return producto;
}

public void setProducto(CompraProducto producto) {
    this.producto = producto;
}

@OneToMany(mappedBy = "producto")
private CompraProducto producto;

public Integer getIdCompra() {
    return idCompra;
}

public void setIdCompra(Integer idCompra) {
    this.idCompra = idCompra;
}

public String getIdCliente() {
    return idCliente;
}

public void setIdCliente(String idCliente) {
    this.idCliente = idCliente;
}

public LocalDateTime getFecha() {
    return fecha;
}

public void setFecha(LocalDateTime fecha) {
    this.fecha = fecha;
}

public String getMedioPago() {
    return medioPago;
}

public void setMedioPago(String medioPago) {
    this.medioPago = medioPago;
}

public String getComentario() {
    return comentario;
}

public void setComentario(String comentario) {
    this.comentario = comentario;
}

public String getEstado() {
    return estado;
}

public void setEstado(String estado) {
    this.estado = estado;
}

}```

1
Jose Alexis Vazquez Morales
Jose Alexis Vazquez Morales
Estudiante

he visto que en el package de service se crean unas interfaces para los servicios y luego se implementa la interfaz en un package service.impl, sera valido hacer esto mismo para esta arquitectura?

1
Jose Alexis Vazquez Morales
Jose Alexis Vazquez Morales
Estudiante

cuando hablamos de “agentes externos” a que tipo de agentes nos referimos? es decir, que tipo de amenazas protege el uso de data mappers?

1
Jose Alexis Vazquez Morales
Jose Alexis Vazquez Morales
Estudiante

cuando creamos un login en una aplicacion web, el login es creado con base al de spring security y lo modificamos desde un framework para front como angular?

o se hace un post desde angular, se mandan las credenciales al backend, lo autenticamos con la base de datos y se crea un token?

1
Hernán Antonio Ramírez Osorio
Hernán Antonio Ramírez Osorio
Estudiante

Hola, que pasa al usar el @AutoWired pero la interface tiene varias implementaciones? Spring como sabe cual de todas las implementaciones se debe inyectar?

2
Rolando Mamani Salas
Rolando Mamani Salas
Estudiante

Si hacemos esto solo para Producto me imagino aremos lo mismo para el resto de las entidades no hay forma de hacer algo generico que nos sirva para todas las entidades ?

1
Rolando Mamani Salas
Rolando Mamani Salas
Estudiante

Por que no usamos el JPARepository si tiene todo y es mas completo ??

1
Rolando Mamani Salas
Rolando Mamani Salas
Estudiante

En este curso se usara Postman ?

1
Daniel Castañeda
Daniel Castañeda
Estudiante

buenas los enlaces al schema y a la data no me funcionan. Pueden regalarme otro enlace de acceso? Muchas gracias!

1