Interview Tip: Walk through a real REST controller live. Explain what each annotation does as you type it — don't just list them.
@RestController // @Controller + @ResponseBody
@RequestMapping("/api/users") // base path for all endpoints
public class UserController {
@Autowired
private UserService userService;
// GET all users
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}
// GET by ID
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
// POST - create
@PostMapping
public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
User saved = userService.save(user);
return ResponseEntity.status(HttpStatus.CREATED).body(saved);
}
// PUT - update
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id,
@RequestBody User user) {
return ResponseEntity.ok(userService.update(id, user));
}
// DELETE
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
// Query param: /api/users/search?name=dip
@GetMapping("/search")
public ResponseEntity<List<User>> search(@RequestParam String name) {
return ResponseEntity.ok(userService.findByName(name));
}
}| Annotation | Purpose |
|---|---|
@RestController |
Marks class as REST controller, returns JSON by default |
@RequestMapping |
Base URL mapping for the class |
@GetMapping |
Handle HTTP GET |
@PostMapping |
Handle HTTP POST |
@PutMapping |
Handle HTTP PUT |
@DeleteMapping |
Handle HTTP DELETE |
@PatchMapping |
Handle HTTP PATCH (partial update) |
@PathVariable |
Extracts value from URI path /{id} |
@RequestParam |
Extracts query param ?name=value |
@RequestBody |
Maps JSON body to Java object |
@ResponseBody |
Converts return value to JSON (included in @RestController) |
@Valid |
Triggers bean validation on request body |
@ResponseStatus |
Set HTTP response status on method/exception |
@RestController=@Controller+@ResponseBodycombined@RequestBodydeserializes JSON → Java object (via Jackson)@PathVariable→ from URL path,@RequestParam→ from query stringResponseEntity<T>gives full control over status code + body + headers- Always use
@Validwith@RequestBodyto trigger validation annotations like@NotNull,@Size