1 - Spring 03 02 Boot Rest
1 - Spring 03 02 Boot Rest
BÁSICO
Boot Rest
CURSOS DE
DESARROLLO
O Objetivos
¿Qué voy a a aprender?
3
Spring Avanzado www.cursosdedesarrollo.com
I Índice de Contenidos
¿Cómo voy a aprenderlo?
1. Introducción
2. Controladores
3. Testing
4. Api Rest
5. Testing Rest
6. ResponseEntity
7. Testing ResponseEntity
8. ControllerAdvice
9. Swagger OpenApi
10.HATEOAS
11.Conclusiones
4
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
https://start.spring.io/
5
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
6
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
7
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
8
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
9
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
10
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
11
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
12
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
13
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
14
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
15
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
16
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
17
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
http://localhost:8080/
18
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Configuración del Proyecto
mvn spring-boot:run
19
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Maven webapp
20
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Maven webapp
21
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Maven webapp
22
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Maven webapp
23
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Maven webapp
24
Spring Avanzado www.cursosdedesarrollo.com
1 Introducción
Maven webapp
25
Spring Avanzado www.cursosdedesarrollo.com
1
26
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@Controller
27
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@Controller
28
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@Controller
@Controller
public class HelloController {
protected final Log logger = LogFactory.getLog(getClass());
@RequestMapping(value="/hello.htm")
public ModelAndView handleRequest(HttpServletRequest
request, HttpServletResponse response)
throws ServletException, IOException {
logger.info(“devolviendo la vista hello.jsp”);
return new ModelAndView(“hello.jsp");
}
}
29
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@Controller
30
Spring Avanzado www.cursosdedesarrollo.com
2
31
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@RestController
32
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@RestController
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MiRestController {
@RequestMapping("/")
public String welcome() {//Welcome page, non-rest
return "Welcome to RestTemplate Example.";
}
}
33
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@RestController
34
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@RestController
35
Spring Avanzado www.cursosdedesarrollo.com
2 Controladores
@RestController
36
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
37
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
38
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
39
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
40
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ApiRestJpaApplicationTests {
@Test
void contextLoads() {
}
41
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
42
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
43
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
mvn test
44
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
45
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
@SpringBootTest
public class SmokeTest {
@Autowired
private MiRestController controller;
@Test
public void miRestControllerLoads() throws Exception {
assertThat(controller).isNotNull();
}
}
46
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
47
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
48
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
https://assertj.github.io/doc/
49
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
https://www.javadoc.io/doc/org.assertj/assertj-cor
e/latest/org/assertj/core/api/AbstractIterableAsse
rt.html#isNotNull
50
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
51
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
import com.cursosdedesarrollo.aplicacionrest.controllers.MainRestController;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static
org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
52
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
@SpringBootTest
@AutoConfigureMockMvc
class AplicacionrestApplicationTests {
// Haciendo una Injección de Dependencias del Controlador en esta clase
// definir un atributo en la clase que se va a auto cargar
@Autowired
private MainRestController controller;
// prueba sobre el controlador
@Test
public void miRestControllerLoads() throws Exception {
// el controlador no es null, es decir carga correctamente
assertNotNull(controller);
assertThat(controller).isNotNull();
}
// Cargar el gestor de peticiones a la aplicación Web
// hace una especie de Mock que carga la aplicación y hace peticioens
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnHello() throws Exception {
// realizar una petición
this.mockMvc.perform(
// hacer un método get en la petición
// indicando la ruta de acceso
get("/hello"))
// imprimir por pantalla el resultado
.andDo(print())
// comprobamos que el status es 200 OK
.andExpect(status().isOk())
// comprobamos que el contenido es lo que esperamos
.andExpect(content().string(containsString("Hello")));
}
}
53
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
54
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
55
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
56
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
57
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
58
Spring Avanzado www.cursosdedesarrollo.com
3 Testing
¿Y cómo pruebo todo esto?
59
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
60
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
https://projectlombok.org/
61
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class Dato {
private Long id;
62
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
63
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
https://projectlombok.org/features/Data
64
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
https://projectlombok.org/features/constructor
65
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
66
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
import org.springframework.web.bind.annotation.*;
import java.util.LinkedList;
import java.util.List;
@RestController
@RequestMapping(value = "/api/dato")
public class APIController {
67
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
68
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
69
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
70
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
71
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
@PostMapping
public Dato addDato(@RequestBody Dato dato) {
lastID++;
dato.setId(lastID);
this.listado.add(dato);
return dato;
}
72
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
73
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
74
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
75
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
76
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
@GetMapping("/{id}")
public Dato showDatoById(@PathVariable("id") Long id){
Dato d = this.listado.stream().filter(dato ->
dato.getId().equals(id)).findFirst().orElse(null);
System.out.println(d);
return d;
}
77
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
78
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
79
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
80
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
81
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
@PutMapping(value = "/{id}")
public Dato editDatoById(
@PathVariable("id") Long id,
@RequestBody Dato dato) {
Dato d = this.listado.stream().filter(elemento ->
elemento.getId().equals(id)).findFirst().orElse(null);
if (dato!=null){
int index = this.listado.indexOf(d);
dato.setId(id);
this.listado.set(index, dato);
return dato;
}else{
return new Dato();
}
}
82
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
83
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
84
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
85
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
@DeleteMapping(value = "/{id}")
public Dato deleteDatoById(@PathVariable Long id){
Dato d = this.listado.stream().filter(elemento ->
elemento.getId().equals(id)).findFirst().orElse(null);
if (d !=null){
this.listado.remove(d);
return d;
}else{
return new Dato();
}
}
86
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
87
Spring Avanzado www.cursosdedesarrollo.com
4 API Rest
¿Cómo defino un API Rest Básico?
88
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
89
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
90
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import java.util.ArrayList;
import java.util.List;
import static
org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest
class ApiControllerTest {
@Autowired
MockMvc mockMvc;
@Autowired
ObjectMapper mapper;
91
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
92
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
93
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
94
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
95
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
96
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
97
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
// ApiController.java
@GetMapping("/clear")
List<Dato> clear(){
this.listado = new LinkedList<>();
this.lastID = 0L;
return this.listado;
}
98
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
99
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
// ApiControllerTest.java
@BeforeEach
public void clearRestData() throws Exception {
System.out.println("limpiando");
mockMvc.perform(
MockMvcRequestBuilders
.get("/api/dato/clear")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}
100
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
101
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
@Test
void testListShouldReturnOkResult() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders
.get(basePath+"/")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
}
102
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
103
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
104
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
@Test
void testListShouldReturnOkResult() throws Exception {
List<Dato> listadoEsperado= new ArrayList<Dato>();
mockMvc.perform(
MockMvcRequestBuilders
.get(basePath+"/")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
// comprobación del tipo de contenido
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
// comprobación del contenido
.andExpect(content().json(mapper.writeValueAsString(listadoEsperado)));
}
105
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
106
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
107
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
@Test
void testAddShouldReturnDato() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders
.post(basePath+"/")
.content(asJsonString(new Dato(0L,"valor")))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(content().json(mapper.writeValueAsString(new
Dato(1L,"valor"))));
}
108
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
109
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
110
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
111
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
@Test
void testGetByIDShouldReturnDato() throws Exception {
// metemos el dato antes de consultarlo
testAddShouldReturnDato();
mockMvc.perform(
MockMvcRequestBuilders
.get(basePath+"/1")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(content().json(mapper.writeValueAsString(new
Dato(1L,"valor"))));
}
112
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
113
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
@Test
void testUpdateShouldReturnDato() throws Exception {
// metemos el dato antes de consultarlo
testAddShouldReturnDato();
mockMvc.perform(
MockMvcRequestBuilders
.patch(basePath+"/1")
.content(asJsonString(new Dato(0L,"valor1")))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(content().json(mapper.writeValueAsString(new
Dato(1L,"valor1"))));
}
114
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
115
Spring Avanzado www.cursosdedesarrollo.com
5 Testing Rest
¿Cómo pruebo un API Rest Básico?
@Test
void testRemoveByIDShouldReturnDato() throws Exception {
// metemos el dato antes de consultarlo
testAddShouldReturnDato();
mockMvc.perform(
MockMvcRequestBuilders
.delete(basePath+"/1")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(content().json(mapper.writeValueAsString(new
Dato(1L,"valor"))));
}
116
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
117
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
118
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
119
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
120
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
121
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
// importaciones
import org.springframework.http.ResponseEntity;
// dentro de la clase
@GetMapping("/{id}")
public ResponseEntity<Dato> showDatoById(@PathVariable("id") Long id){
Dato d = this.listado.stream().filter(dato ->
dato.getId().equals(id)).findFirst().orElse(null);
System.out.println(d);
ResponseEntity<Dato> datoResponseEntity = null;
if (d!=null){
datoResponseEntity = ResponseEntity.ok(d);
}else{
datoResponseEntity = ResponseEntity.notFound().build();
}
return datoResponseEntity;
}
122
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
ResponseEntity<Dato> datoResponseEntity
Dato d
123
Spring Avanzado www.cursosdedesarrollo.com
6 ResponseEntity
¿Y si no es un código 200?
ResponseEntity.ok(d)
124
Spring Avanzado www.cursosdedesarrollo.com
7 Testing ResponseEntity
¿Y cómo probamos esas salidas?
125
Spring Avanzado www.cursosdedesarrollo.com
7 Testing ResponseEntity
¿Y cómo probamos esas salidas?
126
Spring Avanzado www.cursosdedesarrollo.com
7 Testing ResponseEntity
¿Y cómo probamos esas salidas?
@Test
public void testRemoveByIDShouldNotReturnDato() throws
Exception {
mockMvc.perform(
MockMvcRequestBuilders
.delete(BASEURL+"1")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().is(404));
}
127
Spring Avanzado www.cursosdedesarrollo.com
7 Testing ResponseEntity
¿Y cómo probamos esas salidas?
128
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
129
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
130
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
131
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import java.util.Date;
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(value = {ResourceNotFoundException.class})
public ResponseEntity<ErrorMessage>
resourceNotFoundException(ResourceNotFoundException ex, WebRequest
request) {
ErrorMessage message = new ErrorMessage(
200,
new Date(),
ex.getMessage(),
"Error capturado por ResourceNotFoundEcxeption");
return new ResponseEntity<ErrorMessage>(message,
HttpStatus.NOT_FOUND);
}
}
132
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
133
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
134
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
@Data
@AllArgsConstructor
public class ErrorMessage {
private int statusCode;
private Date timestamp;
private String message;
private String description;
}
135
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
ResourceNotFoundException ex y
WebRequest request
136
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
137
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
138
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
// importaciones
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
139
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
140
Spring Avanzado www.cursosdedesarrollo.com
8 ControllerAdvice
¿No podemos ordenarlo mejor?
141
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
https://www.openapis.org/
142
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
https://swagger.io/
143
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
https://springdoc.org/v2/
144
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
https://springdoc.org/
145
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
</dependency>
146
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>
147
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
148
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
149
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
http://localhost:8080/swagger-ui/index.html
150
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
@OpenAPIDefinition(
info = @Info(
title = "Dato API", ok
version = "2.0",
description = "Dato API Demo")
)
151
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
@OpenAPIDefinition(
info = @Info(
title = "Dato API", ok
version = "2.0",
description = "Dato API Demo")
)
152
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
@Tag(
name = "dato",
description = "the dato simple API"
)
153
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
154
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
@Operation(
summary = "show list of dato objects",
description = "Shows a list of dato in an output array",
tags = { "dato" }
)
@ApiResponses(value = {
@ApiResponse(
responseCode = "200",
description = "Successful operation",
content = {
@Content(
mediaType = "application/json",
schema = @Schema(implementation = Dato.class)),
@Content(
mediaType = "application/xml",
schema = @Schema(implementation = Dato.class)) })
})
155
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
@PostMapping(consumes = { "application/json",
"application/xml", "application/x-www-form-urlencoded" })
public Dato addDato(
@Parameter(description = "Created user object")
@Valid @RequestBody Dato dato) {
}
156
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
157
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
158
Spring Avanzado www.cursosdedesarrollo.com
9 Swagger OpenApi
¿Cómo lo documentamos?
159
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
https://en.wikipedia.org/wiki/HATEOAS
160
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
161
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
https://docs.spring.io/spring-hateoas/docs/curren
t/reference/html/#preface
162
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
163
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
164
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
import org.springframework.hateoas.Link;
165
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
166
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.hateoas.RepresentationModel;
@EqualsAndHashCode(callSuper = true)
@Data
public class Customer extends
RepresentationModel<Customer> {
private Long customerId;
private String customerName;
private String companyName;
}
167
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
168
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
import static
org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
@PostMapping
public ResponseEntity<Customer> add(@RequestBody Customer
customer){
lastID++;
customer.setCustomerId(lastID);
this.listado.add(customer);
Link link =
linkTo(CustomerApiController.class).slash(lastID).withSelfRel();
customer.add(link);
return ResponseEntity.ok(customer);
}
169
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
170
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
{
"customerId": 1,
"customerName": "David",
"companyName": "CursosDeDesarrollo",
"_links": {
"self": {
"href": "http://localhost:8080/api/customer/1"
}
}
}
171
Spring Avanzado www.cursosdedesarrollo.com
10 HATEOAS
¿Y si lo ponemos fácil?
172
Spring Avanzado www.cursosdedesarrollo.com
6 Conclusiones
¿Qué podemos sacar en claro?
173
Spring Avanzado www.cursosdedesarrollo.com
CURSOS DE DESARROLLO
DAVID VAQUERO
LICENCIA CC-BY-SA-NC 4.0
[email protected]
https://creativecommons.org/licenses/by-nc-sa/4.0/
http://cursosdedesarrollo.com