Java Spring Boot cơ bản: REST API đầu tiên
🎯 Spring Boot là gì?
Spring Boot là framework giúp xây dựng ứng dụng Java nhanh chóng với:
- Auto-configuration
- Embedded server (Tomcat)
- Production-ready features
1. Setup Project
Bước 1: Generate project
Vào start.spring.io:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.x
- Dependencies: Spring Web, Spring Data JPA, PostgreSQL Driver
Bước 2: Cấu trúc project
src/main/java/com/example/demo
├── DemoApplication.java # Main class
├── controller/ # REST Controllers
├── service/ # Business Logic
├── repository/ # Database Access
└── model/ # Entity classes
src/main/resources
├── application.properties # Config
└── application.yml # Config (alternative)
2. Tạo Entity
// model/User.java
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
// Getters, Setters, Constructors
}
3. Tạo Repository
// repository/UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByNameContaining(String keyword);
}
Giải thích:
- Kế thừa JpaRepository → Có sẵn CRUD methods
- Không cần implement, Spring tự generate!
4. Tạo Service Layer
// service/UserService.java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found"));
}
public User createUser(User user) {
return userRepository.save(user);
}
public User updateUser(Long id, User userDetails) {
User user = getUserById(id);
user.setName(userDetails.getName());
user.setEmail(userDetails.getEmail());
return userRepository.save(user);
}
public void deleteUser(Long id) {
User user = getUserById(id);
userRepository.delete(user);
}
}
5. Tạo REST Controller
// controller/UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
// GET /api/users
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
// GET /api/users/1
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
// POST /api/users
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User created = userService.createUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
// PUT /api/users/1
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(
@PathVariable Long id,
@RequestBody User user
) {
User updated = userService.updateUser(id, user);
return ResponseEntity.ok(updated);
}
// DELETE /api/users/1
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
6. Configuration
application.properties
# Database
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=postgres
spring.datasource.password=password
# JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
# Server
server.port=8080
7. Exception Handling
// exception/ResourceNotFoundException.java
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
// exception/GlobalExceptionHandler.java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(
ResourceNotFoundException ex
) {
ErrorResponse error = new ErrorResponse(
HttpStatus.NOT_FOUND.value(),
ex.getMessage(),
LocalDateTime.now()
);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
}
8. Testing với Postman
GET All Users
GET http://localhost:8080/api/users
POST Create User
POST http://localhost:8080/api/users
Content-Type: application/json
{
"name": "Ngọc Hân",
"email": "han@example.com"
}
PUT Update User
PUT http://localhost:8080/api/users/1
Content-Type: application/json
{
"name": "Updated Name",
"email": "newemail@example.com"
}
9. Best Practices
DTO Pattern
// dto/UserDTO.java
public class UserDTO {
private Long id;
private String name;
private String email;
// No sensitive fields like password!
}
// mapper/UserMapper.java
@Component
public class UserMapper {
public UserDTO toDTO(User user) {
return new UserDTO(user.getId(), user.getName(), user.getEmail());
}
}
Validation
@Entity
public class User {
@NotBlank(message = "Name is required")
private String name;
@Email(message = "Invalid email format")
@NotBlank(message = "Email is required")
private String email;
}
// Controller
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
// If validation fails, return 400 Bad Request
}
10. Kết luận
Bạn đã học:
- ✅ Setup Spring Boot project
- ✅ Entity, Repository, Service, Controller
- ✅ REST API với CRUD operations
- ✅ Exception handling
- ✅ Database configuration
Next steps:
- Học Spring Security (authentication)
- Implement pagination & sorting
- Write unit tests với JUnit & Mockito
- Deploy lên Heroku/Railway
