REST Controllers & Request Mapping
Spring Boot makes building REST APIs extremely concise with @RestController and mapping annotations. Controllers handle HTTP requests, delegate to services, and return JSON responses automatically via Jackson.
1 REST Controller Anatomy
Java — ProductController.java
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import lombok.RequiredArgsConstructor;
@RestController // = @Controller + @ResponseBody
@RequestMapping("/api/v1/products") // Base path for all methods
@RequiredArgsConstructor
public class ProductController {
private final ProductService productService;
// GET /api/v1/products?category=electronics&page=0&size=20
@GetMapping
public ResponseEntity<Page<ProductDto>> getAll(
@RequestParam(required = false) String category,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
return ResponseEntity.ok(productService.findAll(category, page, size));
}
// GET /api/v1/products/42
@GetMapping("/{id}")
public ResponseEntity<ProductDto> getById(@PathVariable Long id) {
return ResponseEntity.ok(productService.findById(id));
}
// POST /api/v1/products
@PostMapping
public ResponseEntity<ProductDto> create(
@RequestBody @Valid CreateProductRequest req) {
ProductDto created = productService.create(req);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
// PATCH /api/v1/products/42
@PatchMapping("/{id}")
public ResponseEntity<ProductDto> update(
@PathVariable Long id,
@RequestBody @Valid UpdateProductRequest req) {
return ResponseEntity.ok(productService.update(id, req));
}
// DELETE /api/v1/products/42
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
productService.delete(id);
return ResponseEntity.noContent().build(); // 204 No Content
}
}
2 Request Parameter Types
| Annotation | Source | Example |
|---|---|---|
@PathVariable | URL path segment | /users/{id} |
@RequestParam | Query string | /users?role=admin |
@RequestBody | JSON request body | POST/PUT/PATCH body |
@RequestHeader | HTTP header | Authorization: Bearer ... |
@CookieValue | Cookie | Cookie: sessionId=abc |
3 Code Challenge
Challenge: Build a
BookController with full CRUD endpoints. Add a GET /api/v1/books/search endpoint that accepts ?title=spring&author=Craig query params and returns matching books. Return proper HTTP status codes for each operation.