web-dev-qa-db-fra.com

@ResponseBody, ResponseEntity Spring, objet de retour au format JSON

J'utilise Spring version 4 (données de printemps). Je souhaite renvoyer Object en JSON. Je me demandais si le code suivant fonctionnait même sans annoter la classe d'utilisateurs avec xmlRootElement:

@RequestMapping(value = "/resources/users", method = RequestMethod.GET)
public ResponseEntity<User> getUserByLogonId(OAuth2Authentication auth) {

    String userLogonId = ((org.springframework.security.core.userdetails.User) auth.getUserAuthentication()
            .getPrincipal()).getUsername();
    UsersServices usersServices = new UsersServicesImpl(usersOperations);
    User user = usersServices.findByLogonId(userLogonId);
    HttpStatus userStatus = HttpStatus.NOT_FOUND;
    if (user != null) {
        userStatus = HttpStatus.FOUND;
    }
    return new ResponseEntity<User>(user, userStatus);
}

n'importe quel corps peut-il expliquer? ResponseBody/ResponseEntity fait-il le travail lui-même? lorsque j’ai besoin d’annoter la classe d’objets à retourner en tant que JSON.

5
Mohammad Karmi

@RestController ajoute lui-même l'annotation @ResponseBody. Vous pouvez le voir dans Github Issue

Vous pouvez également consulter les tutoriels officiels de printemps . Ici vous pouvez vérifier les lignes et exemples ci-dessous:

Ces méthodes de contrôleur renvoient des POJO simples - Collection<Bookmark>, et Bookmark, etc., dans tous les cas sauf le add. Lorsqu'une requête HTTP entre qui spécifie un Accept header, Spring MVC parcourt le fichier configuré HttpMessageConverter jusqu'à ce qu'il en trouve un qui peut convertir des types de modèle de domaine POJO au type de contenu spécifié dans le Accept header, si ainsi configuré.

Vous pouvez également suivre les lignes et exemples ci-dessous de Doc officiel

@RestController est une annotation de stéréotype qui combine @ResponseBody et @Controller. Plus que cela, cela donne plus de sens à votre Contrôleur et peut également porter une sémantique supplémentaire dans les prochaines versions du cadre.

Et, 

Comme avec @RequestBody et @ResponseBody, Spring utilise HttpMessageConverter pour convertir depuis et vers la demande et la réponse ruisseaux.

1
sunkuet02

xmlRootElement utilise pour représenter un objet en tant qu'élément XML dans un document XML. XML n'a rien à voir avec JSON.
Lorsque vous annotez votre classe par @RestController, il combine @Controller pour la classe et @ResponseBody pour chaque méthode. Ensuite, HttpMessageConverter convertit les flux de demande et de réponse à partir de ceux-ci.
@ResponseEntity est utilisé pour former une réponse http avec des paramètres personnalisés (en-têtes, code http, etc.). Par exemple: 

return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
1
Nikolay

Spring Boot utilise les bibliothèques jackson json pour organiser et désorganiser les objets Java de/vers les objets json.

0
Srinivas Seema