Semana_5_Java_Api_Rest
Semana_5_Java_Api_Rest
¿Qué es @RestController?
Semana 7 1
@RestController es una combinación de @Controller y @ResponseBody , lo que significa
que:
@RestController
@RequestMapping("/api/todos")
public class TodoController {
private final TodoService todoService;
@GetMapping
public List<Todo> getAllTodos() {
return todoService.getAllTodos();
}
}
automáticamente.
Semana 7 2
Tipos de Mapeo
@RestController
@RequestMapping("/api/todos")
public class TodoController {
@GetMapping("/{id}")
public ResponseEntity<Todo> getTodoById(@PathVariable Long id) {
return todoService.getTodoById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public Todo createTodo(@RequestBody Todo todo) {
return todoService.createTodo(todo);
}
@PutMapping("/{id}")
public ResponseEntity<Todo> updateTodo(@PathVariable Long id, @Reque
stBody Todo todo) {
return ResponseEntity.ok(todoService.updateTodo(id, todo));
Semana 7 3
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteTodo(@PathVariable Long id) {
todoService.deleteTodoById(id);
return ResponseEntity.noContent().build();
}
}
✅ : Extrae el ID de la URL.
✅
@PathVariable Long id
ResponseEntity : Permite devolver códigos HTTP como 200 OK, 404 Not Found, 204
No Content, etc.
@Entity
@Table(name = "todos")
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
Semana 7 4
private boolean completed;
}
Repositorio (JpaRepository)
Un repositorio permite interactuar con la base de datos sin necesidad de escribir
SQL.
@Repository
public interface TodoRepository extends JpaRepository<Todo, Long> {
}
✅
JpaRepository<Todo, Long> proporciona métodos listos para usar:
✅
@Repository : Indica que esta interfaz es un componente de persistencia.
Semana 7 5
✅ Operaciones CRUD básicas:
save(T entity) : Guarda o actualiza una entidad.
Servicios (@Service)
Los servicios en Spring Boot manejan la lógica de negocio y actúan como
intermediarios entre el controlador y el repositorio.
@Service
public class TodoService {
private final TodoRepository todoRepository;
Semana 7 6
return todoRepository.findById(id).map(todo -> {
todo.setTitle(todoDetails.getTitle());
todo.setCompleted(todoDetails.isCompleted());
return todoRepository.save(todo);
}).orElseThrow(() -> new RuntimeException("Tarea no encontrada"));
}
Configuración BD
<dependencies>
<!-- Spring Web -->
<dependency>
Semana 7 7
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Semana 7 8
✅ Explicación:
spring.datasource.url : URL de conexión a la base de datos ( localhost , puerto 3306 ).
spring.jpa.hibernate.ddl-auto=update :
@Entity
@Table(name = "todos")
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
Semana 7 9
private boolean completed;
}
✅ Explicación:
@Entity : Marca la clase como una entidad JPA.
spirng initializr
https://www.youtube.com/watch?v=M7lhQMzzHWU
https://www.youtube.com/watch?v=3cJeqk3RYyM
package com.example.todoapp.model;
import jakarta.persistence.*;
import lombok.*;
@Entity
@Table(name = "todos")
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
public class Todo {
@Id
Semana 7 10
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private boolean completed;
}
Archivo: TodoRepository.java
package com.example.todoapp.repository;
import com.example.todoapp.model.Todo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
Semana 7 11
public interface TodoRepository extends JpaRepository<Todo, Long> {
}
package com.example.todoapp.service;
import com.example.todoapp.model.Todo;
import com.example.todoapp.repository.TodoRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class TodoService {
private final TodoRepository todoRepository;
Semana 7 12
public Todo createTodo(Todo todo) {
return todoRepository.save(todo);
}
Explicación
getAllTodos() : Obtiene todas las tareas.
Archivo: TodoController.java
package com.example.todoapp.controller;
import com.example.todoapp.model.Todo;
import com.example.todoapp.service.TodoService;
Semana 7 13
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/todos")
public class TodoController {
private final TodoService todoService;
@GetMapping
public List<Todo> getAllTodos() {
return todoService.getAllTodos();
}
@GetMapping("/{id}")
public ResponseEntity<Todo> getTodoById(@PathVariable Long id) {
return todoService.getTodoById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public Todo createTodo(@RequestBody Todo todo) {
return todoService.createTodo(todo);
}
@PutMapping("/{id}")
public ResponseEntity<Todo> updateTodo(@PathVariable Long id, @Reque
stBody Todo todo) {
try {
Todo updatedTodo = todoService.updateTodo(id, todo);
Semana 7 14
return ResponseEntity.ok(updatedTodo);
} catch (RuntimeException e) {
return ResponseEntity.notFound().build();
}
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteTodo(@PathVariable Long id) {
todoService.deleteTodoById(id);
return ResponseEntity.noContent().build();
}
}
Explicación
@RestController : Indica que este controlador maneja peticiones REST.
Semana 7 15