web-dev-qa-db-fra.com

Comment lier @RequestParam à un objet dans Spring MVC?

Je veux faire une demande POST via AJAX, et je veux également lier tout l'objet de classe à la demande, et je veux recevoir cette demande avec @requestParam annotation. Je sais que cela peut être fait avec @requestBody annotation, mais je suis curieux de savoir: peut-on le faire avec @requestParam annotation?

Un code Ajax:

var restDTO{
    id: 3,
    name: "hello"
}

 $.ajax({
          url: url, 
          type: 'POST',
          dataType: 'json',
          contentType: 'application/json',
          mimeType: 'application/json',
          data: JSON.stringify({RestDTO : restDTO}),          
          success: function(data) 
    {
    }

J'ai RestDTO

Class RestDTO 
{

    int id;
    String name;

    //getter and setter

}

Dans le contrôleur

public String content(@RequestParam RestDTO restDTO){...}

Que dois-je faire pour exécuter ce code?

Que dois-je changer lors de l'envoi de données depuis ajax?

Dois-je changer de serveur pour recevoir un objet RestDto avec @requestParam annotation?

6
user3029929

Vous ne pouvez pas, car @RequestParam indique simplement que le paramètre de la méthode one doit être lié à un paramètre de requête Web one. Il ne peut pas faire de mappage avec des objets. Pour utilisation @RequestParam vous devez modifier la demande ajax:

var restDTO{
   id: 3,
   name: "hello"
}

 $.ajax({
          url: url, 
          type: 'POST',
          data: restDTO,          
          success: function(data){
             ....
          }
});

JQuery enverra la demande en tant que application/x-www-form-urlencoded et traitera automatiquement les données en paramètres. La méthode de votre contrôleur devrait ressembler à ceci:

@RequestMapping("/url")
public String content(@RequestParam Long id, @RequestParam String name){...}

Pour mapper automatiquement des paramètres à un objet, vous pouvez utiliser @ModelAttribute annotation:

@RequestMapping("/url")
public String content(@ModelAttribute RestDTO restDTO){...}

Dans ce cas, les noms dans la carte javascript doivent correspondre aux noms des propriétés dans RestDTO.

Généralement, @ModelAttribute et @RequestBody créé aux mêmes fins: pour lier les données de la requête à la méthode (qu'il s'agisse d'objets de type primitif).

Je considère que @ModelAttribute est plus pratique lorsque vous travaillez avec des formulaires html et des objets simples. Il existe des capacités Spring prêtes à l'emploi comme modelAttribute et path.

À son tour, @RequestBody plus flexible, lorsque vous avez besoin d'un contrôle manuel des données. En outre, c'est plus pratique lorsque vous travaillez avec des objets complexes.

Personnellement, je préfère @RequestBody et json.

14
Ken Bekov

Si vous envoyez vos données en tant que paramètres de demande classiques, vous pouvez vous lier à l'objet en omettant simplement le @RequestParam, donc

public String content(RestDTO restDTO){...}

Si vous envoyez json, vous devez utiliser @RequestBody.

Si vous insistez pour que @RequestParam , notez que vous pouvez lier plusieurs valeurs à une carte, donc

public String content(@RequestParam Map<String, String> restDTO){...}

Du @RequestParam doc

Si le paramètre de méthode est Map ou MultiValueMap et qu'un nom de paramètre n'est pas spécifié, le paramètre de carte est rempli avec tous les noms et valeurs de paramètre de demande.

8
Master Slave

Au printemps, vous avez ces annotations:

RequestParam - utilisé pour obtenir les paramètres (/ path? Name =)

PathVariable - utilisé pour les paramètres de chemin (/ chemin/{nom})

RequestBody - utilisé pour le corps post/put/patch etc.

RequestHeader - pour les en-têtes

Vous ne pouvez donc pas utiliser RequestParam pour les paramètres de publication, peu importe si json ou non

3
Alexandru Godri