Sobes.tech
Junior

Ποια είναι η διαφορά μεταξύ των annotations RestController και Controller στο Spring;

sobes.tech AI

Απάντηση από AI

@Controller χρησιμοποιείται για τον ορισμό ελεγκτών που χειρίζονται αιτήματα ιστού. Οι μέθοδοι σε μια τέτοια κλάση συνήθως επιστρέφουν ονόματα προβολών (view names), τα οποία στη συνέχεια αποδίδει το Spring MVC.

@RestController είναι μια εξειδικευμένη έκδοση του @Controller. Συνδυάζει το @Controller και το @ResponseBody. Αυτό σημαίνει ότι οι μέθοδοι σε μια τέτοια κλάση, κατά προεπιλογή, δεν επιστρέφουν ονόματα προβολών, αλλά αντικείμενα που στη συνέχεια σειριοποιούνται αυτόματα σε JSON ή XML (ανάλογα με τη διαμόρφωση) και αποστέλλονται πίσω στον πελάτη στο σώμα της απάντησης HTTP.

Η βασική διαφορά είναι ότι το @Controller προορίζεται για τη δημιουργία web εφαρμογών με παραδοσιακή σερβερ-πλευρική απόδοση (αρχιτεκτονική MVC), ενώ το @RestController για τη δημιουργία RESTful web υπηρεσιών, όπου οι απαντήσεις παρουσιάζονται με τη μορφή δεδομένων.

Μπορεί να πει κανείς ότι το @RestController είναι ζάχαρη σύνταξης για το @Controller συν το @ResponseBody.

// Παράδειγμα χρήσης του @Controller
@Controller
@RequestMapping("/pages")
public class ViewController {

    @GetMapping("/welcome")
    public String showWelcomePage() {
        return "welcome"; // Επιστρέφει το όνομα της προβολής (welcome.html, welcome.jsp κ.λπ.)
    }
}

// Παράδειγμα χρήσης του @RestController
@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        // Επιστρέφει ένα αντικείμενο User που θα σειριοποιηθεί αυτόματα σε JSON/XML
        return userService.findById(id);
    }
}