# Building REST APIs with Spring Boot
Spring Boot makes it easy to create REST APIs with minimal configuration. Here’s a basic controller:
@RestController@RequestMapping("/api/users")@CrossOrigin(origins = "http://localhost:3000")public class UserController {
@Autowired private UserService userService;
@GetMapping public ResponseEntity<List<User>> getAllUsers() { List<User> users = userService.findAll(); return ResponseEntity.ok(users); }
@GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id) { Optional<User> user = userService.findById(id); return user.map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); }
@PostMapping public ResponseEntity<User> createUser(@Valid @RequestBody User user) { User savedUser = userService.save(user); return ResponseEntity.status(HttpStatus.CREATED).body(savedUser); }}
Creating a service layer for business logic:
@Service@Transactionalpublic class UserService {
@Autowired private UserRepository userRepository;
public List<User> findAll() { return userRepository.findAll(); }
public Optional<User> findById(Long id) { return userRepository.findById(id); }
public User save(User user) { user.setCreatedAt(LocalDateTime.now()); return userRepository.save(user); }
public void deleteById(Long id) { userRepository.deleteById(id); }
public List<User> findByEmail(String email) { return userRepository.findByEmailContainingIgnoreCase(email); }}
Global exception handling for clean error responses:
@ControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) { ErrorResponse error = new ErrorResponse( HttpStatus.NOT_FOUND.value(), ex.getMessage(), System.currentTimeMillis() ); return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error); }
@ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<ErrorResponse> handleValidationErrors(MethodArgumentNotValidException ex) { ErrorResponse error = new ErrorResponse( HttpStatus.BAD_REQUEST.value(), "Validation failed", System.currentTimeMillis() ); return ResponseEntity.badRequest().body(error); }}
./mvnw spring-boot:run# Or with Gradle./gradlew bootRun