REST Controllers & Request Mapping

🌿 Spring BootLesson 4Beginner

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
AnnotationSourceExample
@PathVariableURL path segment/users/{id}
@RequestParamQuery string/users?role=admin
@RequestBodyJSON request bodyPOST/PUT/PATCH body
@RequestHeaderHTTP headerAuthorization: Bearer ...
@CookieValueCookieCookie: 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.