Supposons que j'ai une page qui répertorie les objets sur une table et que j'ai besoin de mettre un formulaire pour filtrer la table. Le filtre est envoyé en tant que GET Ajax à une URL comme celle-ci: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
Et au lieu d'avoir beaucoup de paramètres sur mon contrôleur comme:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
Et en supposant que j'ai MyObject comme:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Je veux faire quelque chose comme:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
C'est possible? Comment puis je faire ça?
java
spring-mvc
renanleandrof
la source
la source
@ModelAttribute
, Exemple de gestion de formulaire Spring MVC . Il suffit de google " Gestion des formulaires Spring MVC " et vous obtiendrez une tonne de tutoriels / exemples. Mais assurez-vous d'utiliser un moyen moderne de gestion des formulaires, c'est-à-dire Spring v2.5 +@ModelAttribute
dans Spring MVCRéponses:
Vous pouvez absolument le faire, supprimez simplement l'
@RequestParam
annotation, Spring liera proprement vos paramètres de requête à votre instance de classe:la source
MyObject
, de la même manière que nous pouvons le faire avec @RequestParam?MyObject
à jour le pour accepter les paramètres de requête dans le cas Snake et le mapper à un membre de cas de chameauMyObject
. Par exemple,?book_id=4
doit être mappé avec lebookId
membre duMyObject
?J'ajouterai un petit exemple de ma part.
La classe DTO:
Demande de mappage à l'intérieur de la classe de contrôleur:
Requete:
Résultat:
J'espère que cela aide :)
MISE À JOUR / KOTLIN
Parce qu'actuellement, je travaille beaucoup avec Kotlin si quelqu'un veut définir un DTO similaire, la classe dans Kotlin devrait avoir la forme suivante:
Avec la
data
classe comme celle-ci:le Spring (testé dans Boot) renvoie l'erreur suivante pour la requête mentionnée dans la réponse:
La classe de données fonctionnera uniquement pour le formulaire de paramètres de requête suivant:
Soyez conscient de cela!
la source
J'ai un problème très similaire. En fait, le problème est plus profond que je le pensais. J'utilise jquery
$.post
qui utiliseContent-Type:application/x-www-form-urlencoded; charset=UTF-8
par défaut. Malheureusement, j'ai basé mon système sur cela et quand j'avais besoin d'un objet complexe,@RequestParam
je ne pouvais pas simplement le réaliser.Dans mon cas, j'essaye d'envoyer les préférences de l'utilisateur avec quelque chose comme;
Du côté client, les données brutes réelles envoyées au serveur sont;
analysé comme;
et le côté serveur est;
J'ai essayé
@ModelAttribute
, ajouté des setter / getters, des constructeurs avec toutes les possibilitésUserPreferences
mais aucune chance car il reconnaissait les données envoyées comme 5 paramètres mais en fait la méthode mappée n'a que 2 paramètres. J'ai également essayé la solution de Biju, mais ce qui se passe, c'est que Spring crée un objet UserPreferences avec le constructeur par défaut et ne remplit pas les données.J'ai résolu le problème en envoyant la chaîne JSon des préférences du côté client et je la gère comme si c'était une chaîne côté serveur;
client:
serveur:
en bref, j'ai fait la conversion manuellement dans la méthode REST. À mon avis, la raison pour laquelle Spring ne reconnaît pas les données envoyées est le type de contenu.
la source
@RequestMapping(method = POST, path = "/settings/{projectId}") public void settings(@PathVariable String projectId, @RequestBody ProjectSettings settings)
Étant donné que la question sur la façon de définir les champs obligatoires apparaît sous chaque message, j'ai écrit un petit exemple sur la façon de définir les champs comme requis:
la source
Alors que les réponses qui font référence à
@ModelAttribute
,@RequestParam
,@PathParam
et les goûts sont valides, il y a un petit Gotcha je suis tombé. Le paramètre de méthode résultant est un proxy que Spring enveloppe votre DTO. Ainsi, si vous essayez de l'utiliser dans un contexte qui nécessite votre propre type personnalisé, vous pouvez obtenir des résultats inattendus.Les éléments suivants ne fonctionneront pas:
Dans mon cas, essayer de l'utiliser dans la liaison Jackson a abouti à un
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
.Vous devrez créer un nouvel objet à partir du dto.
la source
Oui, vous pouvez le faire de manière simple. Voir ci-dessous le code des lignes.
URL - http: // localhost: 8080 / get / request / multiple / param / by / map? Name = 'abc' & id = '123'
la source
La réponse acceptée fonctionne comme un charme, mais si l'objet a une liste d'objets, cela ne fonctionnera pas comme prévu, voici donc ma solution après quelques recherches.
En suivant ces conseils de fil , voici comment j'ai fait.
Ce n'est pas le meilleur pour déboguer votre API avec postman, mais cela fonctionne comme prévu pour moi.
Et ici les SearchFilterDTO et FilterDTO
la source