Contrôleurs

TODO: RestController, ResponseBody

Bases

Une classe contrôleur est déclarée à l'aide d'un @Controller.

@Controller
public class MyController {}

Pour définir un handler sur route, il faut créer une fonction, et utiliser un attribut RequestMapping.

@RequestMapping prend en premier paramètre la route sur laquelle se bind (@RequestMapping("/")), et la méthode est définissable à l'aide du paramètre nommé method, par exemple method = RequestMethod.GET.

@Controller
public class MyController {
    @RequestMapping("/", method = RequestMethod.GET)
    public void index() {
        // ...
    }
}

Additionnellement, Spring fournit des raccourcis, nommés @<méthode>Mapping, par exemple @GetMapping.

Préfixe de chemin

Dans le cas où toutes les méthodes de notre contrôleur ont un préfixe commun, par exemple /books/*, on peut utiliser @RequestMapping sur la classe.

@Controller
@RequestMapping("/books")
public class BookController {
    @GetMapping("/")
    public String listBooks() {
        // ...
    }

    @GetMapping("/by-author")
    public String listBooksGroupedByAuthor() {
        // ...
    }
}

Sur cet exemple, les routes crées sont /books et /books/by-author.

Réponse JSON

Un contrôleur @RestController permet de renvoyer des objets bruts, et de laisser Spring s'occuper de la sérialisation en JSON.

@RestController
public class TestController {
    @GetMapping("/")
    public TestResponse handle() {
        // Doing stuff, returning an instance
    }

    private static class TestResponse {
        private final String field;
        private final Integer anotherField;

        TestResponse(String field, Integer anotherField) {
            this.field = field;
            this.anotherField = anotherField;
        }

        public String getField() { return field; }

        public Integer getAnotherField() { return anotherField; }
    }
}
{
    "field": "value",
    "anotherField": 666
}

Il est possible de renommer la clé qui sera utilisée pour le champ dans la réponse, à l'aide de l'annotation @JsonProperty appliquable sur le getter.

@JsonProperty("myOwnCustomField")
public String getField() { return field; }
{
    "myOwnCustomField": "value",
    "anotherField": 666
}