J'ai un problème très similaire. En fait, le problème est plus profond que je ne le pensais. J'utilise jquery $.post
qui utilise Content-Type:application/x-www-form-urlencoded; charset=UTF-8
par défaut. Malheureusement, j'ai basé mon système là-dessus et lorsque j'ai eu besoin d'un objet complexe en tant que @RequestParam
Je ne pouvais pas faire en sorte que ça arrive.
Dans mon cas, j'essaie d'envoyer les préférences de l'utilisateur avec quelque chose comme ;
$.post("/updatePreferences",
{id: 'pr', preferences: p},
function (response) {
...
Du côté du client, les données brutes envoyées au serveur sont les suivantes ;
...
id=pr&preferences%5BuserId%5D=1005012365&preferences%5Baudio%5D=false&preferences%5Btooltip%5D=true&preferences%5Blanguage%5D=en
...
analysé comme ;
id:pr
preferences[userId]:1005012365
preferences[audio]:false
preferences[tooltip]:true
preferences[language]:en
et le côté serveur l'est ;
@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") UserPreferences preferences) {
...
return someService.call(preferences);
...
}
J'ai essayé @ModelAttribute
Nous avons ajouté des fixateurs, des récupérateurs et des constructeurs avec toutes les possibilités de l'utilisateur. UserPreferences
mais aucune chance car il a reconnu 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 en la traitant comme s'il s'agissait d'une chaîne du côté serveur ;
client :
$.post("/updatePreferences",
{id: 'pr', preferences: JSON.stringify(p)},
function (response) {
...
serveur :
@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") String preferencesJSon) {
String ret = null;
ObjectMapper mapper = new ObjectMapper();
try {
UserPreferences userPreferences = mapper.readValue(preferencesJSon, UserPreferences.class);
return someService.call(userPreferences);
} catch (IOException e) {
e.printStackTrace();
}
}
Pour résumer, j'ai fait la conversion manuellement dans la méthode REST. A mon avis, la raison pour laquelle Spring ne reconnaît pas les données envoyées est le content-type.