@RestController, path variables, request bodies — build clean REST endpoints.
Published February 5, 2025
@RestController
@RequestMapping("/api/v1/products")
public class ProductController {
private final ProductService productService;
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping
public List<ProductDto> getAllProducts() {
return productService.findAll();
}
@GetMapping("/{id}")
public ProductDto getProduct(@PathVariable String id) {
return productService.findById(id);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public ProductDto createProduct(@RequestBody @Valid CreateProductRequest request) {
return productService.create(request);
}
@PutMapping("/{id}")
public ProductDto updateProduct(@PathVariable String id,
@RequestBody @Valid UpdateProductRequest request) {
return productService.update(id, request);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteProduct(@PathVariable String id) {
productService.delete(id);
}
}
// GET /products?category=electronics&page=0&size=20
@GetMapping
public Page<ProductDto> getProducts(
@RequestParam(required = false) String category,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
return productService.findAll(category, PageRequest.of(page, size));
}
@GetMapping("/{id}")
public ResponseEntity<ProductDto> getProduct(@PathVariable String id) {
return productService.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
| HTTP Method | Action | Status |
|---|---|---|
| GET | Read | 200 OK |
| POST | Create | 201 Created |
| PUT | Replace | 200 OK |
| PATCH | Partial update | 200 OK |
| DELETE | Delete | 204 No Content |
Be able to explain the difference between @Controller and @RestController: @RestController is @Controller + @ResponseBody — it automatically serialises return values to JSON instead of resolving them as view names.