Spring MVC 中不存在必需的字符串参数错误

Posted

技术标签:

【中文标题】Spring MVC 中不存在必需的字符串参数错误【英文标题】:Required String parameter is not present error in Spring MVC 【发布时间】:2013-11-06 07:09:17 【问题描述】:

我尝试在 Spring MVC 中对我的控制器进行 AJAX 查询。

我的操作代码是:

@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    

我的 Ajax 查询是:

$.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
        
    );

但我得到一个错误:

必需的字符串参数''start_date 不存在

为什么? 据我所知,我将其介绍为 (@RequestParam(value = "start_date") String start_date

UDP 现在我给 404 我的班级取数据

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

我的 js AJAX 调用是:

$.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"
    ),

和控制器动作:

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

而 JSON 数据是:

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

【问题讨论】:

jquery 是否将data 元素序列化为请求参数?作为 url-encoded-form 参数? 只是JS文件中的变量 在您的两个示例中,您是否尝试过实际检查您的 POST 请求并确保它传递了所需的值?在每种情况下都显示了什么? 【参考方案1】:

在服务器端,您希望您的请求参数作为查询字符串,但在客户端,您发送一个 json 对象。要绑定 json,您需要创建一个包含所有参数的类,并使用 @RequestBody 注释而不是 @RequestParam。

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

Here is更详细的解释。

【讨论】:

您能发布您尝试发送的实际 JSON 吗?您可以使用 Firebug 或 Chrome/Chromium 捕获它。 你能写吗,我如何在谷歌浏览器中看到它? 在请求负载中显示 start_date=Tue+Oct+01+2013+00%3A00%3A00+GMT%2B0400+(Russian+Standard+Time)&end_date=Tue+Oct+01+2013+00 %3A05%3A00+GMT%2B0400+(俄语+标准+时间)&text=New+event&userId= 这很奇怪,似乎 jquery 默认将数据作为查询字符串发送。这在 POST 请求的情况下不好。尝试在您的 .ajax 请求中添加 processData: false 标志,并将您的数据元素包装在 JSON.stringify(...) 调用中。喜欢:pastebin.com/JLKgLivC 在 chrome 中查看请求有效负载:工具 > 开发人员工具 > 网络选项卡 我发现了一个问题。它在控制器的返回值中。我没有设置 JSP 页面,它总是返回 404。你的答案是正确的【参考方案2】:

我遇到了同样的问题。我通过在发布请求中指定配置参数解决了它:

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


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

config 是我包含的参数,它开始工作.. 希望对你有帮助:)

【讨论】:

【参考方案3】:

Spring 引导代码

@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    

要发送的 Postman 请求链接: 在 postman 中使用 Parmas 添加参数和值,并查看以下请求链接。

http://localhost:8080/events/add?start_date=*someValue*&end_date=*someValue*&text=*someValue*&userId=*someValue*

【讨论】:

以上是关于Spring MVC 中不存在必需的字符串参数错误的主要内容,如果未能解决你的问题,请参考以下文章

404错误资源在spring mvc中不可用

由于 Spring MVC 中不存在 URL,验证表单提交按钮在第二次尝试后返回 404

带有 Spring WebFlux 的 RestController:必需参数不存在

Spring 4 - HTTP 状态 400,必需参数不存在

必需的字符串参数“电子邮件”不存在

Spring MVC 中创建的模型对象到底在哪里?