web-dev-qa-db-fra.com

Le paramètre String requis n'est pas présent. Erreur dans Spring MVC

J'essaie d'envoyer une requête AJAX à mon contrôleur dans Spring MVC.

Mon code d'action est:

@RequestMapping(value = "events/add", method = RequestMethod.POST)
public void addEvent(@RequestParam(value = "start_date") String start_date, @RequestParam(value = "end_date") String end_date, @RequestParam(value = "text") String text, @RequestParam(value = "userId") String userId){
    //some code    
}

Ma requête Ajax est:

$.ajax({
        type: "POST",
        url:url,
        contentType: "application/json",
        data:     {
                start_date:   scheduler.getEvent(id).start_date,
                end_date:  scheduler.getEvent(id).end_date,
                text: scheduler.getEvent(id).text,
                userId: userId
        },
        success:function(result){
         //here some code
        }
    });

Mais j'ai une erreur: 

Le paramètre de chaîne obligatoire '' date_début n'est pas présent.

Pourquoi? Comme je sais que je l'ai présenté comme (@RequestParam(value = "start_date") String start_date

UDP
Maintenant, je donne 404Ma classe pour prendre des données

public class EventData {
    public String end_date;
    public String start_date;
    public String text;
    public String userId;
    //Getters and setters
}

Mon appel js AJAX est:

$.ajax({
    type: "POST",
    url:url,
    contentType: "application/json",
    // data: eventData,
    processData: false,
    data:    JSON.stringify({
        "start_date":   scheduler.getEventStartDate(id),
        "end_date":  scheduler.getEventEndDate(id),
        "text": scheduler.getEventText(id),
        "userId": "1"
    }),

Et action du contrôleur:

@RequestMapping(value = "events/add", method = RequestMethod.POST)
public void addEvent(@RequestBody EventData eventData){    
}

Et les données JSON sont:

end_date: "2013-10-03T20:05:00.000Z"
start_date: "2013-10-03T20:00:00.000Z"
text: "gfsgsdgs"
userId: "1"
16
nabiullinas

Du côté serveur, vous attendez vos paramètres de requête en tant que chaînes de requête, mais du côté client, vous envoyez un objet JSON. Pour lier un json, vous devez créer une seule classe contenant tous vos paramètres et utiliser l'annotation @RequestBody au lieu de @RequestParam.

@RequestMapping(value = "events/add", method = RequestMethod.POST)
public void addEvent(@RequestBody CommandBean commandBean){
    //some code
}

Voici une explication plus détaillée.

35
gadget

J'ai eu le même problème .. Je l'ai résolu en spécifiant les paramètres de configuration dans la demande de poste:

var config = {
    transformRequest : angular.identity,
    headers: { "Content-Type": undefined }
}

$http.post('/getAllData', inputData, *config*).success(function(data,status) {
    $scope.loader.loading = false;
})

config était le paramètre que j’avais inclus et il a commencé à fonctionner ...

0
User-8017771