【问题标题】:@RequestBody attribute is empty after ajax POST method callajax POST 方法调用后@RequestBody 属性为空
【发布时间】:2017-11-28 05:47:17
【问题描述】:

我正在尝试向服务器发送 ajax POST 请求并检索响应。 我的问题是,当我提交表单时,我的 @RequestBody 参数为空。 我按照这个教程做了和那个人一样的事情。 http://www.mkyong.com/spring-mvc/spring-4-mvc-ajax-hello-world-example/

代码的相关部分: 控制器:

@JsonView(Views.Public.class)
    @RequestMapping(value = "searchEvents", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public ModelAndView findEvents(HttpServletRequest request, HttpServletResponse response, @RequestBody EventFilterBean eventFilterBean) {
        ///
    }

index.jsp

var search = {}
        search["eventName"] = $("#eventName").val();

        $.ajax({
            type : "POST",
            contentType : "application/json",
            url : "searchEvents",
            data : JSON.stringify(search),
            dataType : 'json',
            timeout : 100000
        });

在 pom.xml 我添加了

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.9.0.pr3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.0.pr3</version>
            </dependency>

我试图在谷歌上找到解决方案,但我找不到。提前感谢您的帮助。

【问题讨论】:

    标签: ajax spring-mvc jackson


    【解决方案1】:

    我安装了 fiddler 并得出结论 $("#eventName").val();没有给我我想要的字符串。当我更改 search["eventName"] = $("#eventName").val(); to search["eventName"] = "Some hardcoded string";有用。即使没有 @JsonView(Views.Public.class)

    也能正常工作

    【讨论】:

      【解决方案2】:

      根据:

          var search = {}
          search["eventName"] = $("#eventName").val();
      
          $.ajax({
              type : "POST",
              contentType : "application/json",
              url : "searchEvents",
              data : JSON.stringify(search),
              dataType : 'json',
              timeout : 100000
          });
      

      您发送的是字符串格式的 JSON,所以首先要做的是在字符串参数上添加 @RequestBody 注释。

      其次,将/ 添加到您的路线值。

      第三,如果您使用的是 Ajax,则无法返回 ModelAndView,您需要返回一条 HTTP 消息,其中包含您的响应。

      像这样:

      @RequestMapping(value = "/searchEvents", method = RequestMethod.POST, consumes = "application/json", produces="application/json")
          @ResponseBody
          public ResponseEntity<String> findEvents(HttpServletRequest request, HttpServletResponse response, @RequestBody String eventFilterBean) {
              ///
          }
      

      【讨论】:

      • 您好,非常感谢您的回答。我同意返回值,但这不是我现在的问题。您可以在教程中看到可以将我自己的自定义类作为参数传递,并且在该教程中有效。正如我从教程中了解到的那样,我应该在类路径中包含杰克逊,杰克逊应该能够解析和匹配来自 json 的 eventName 字段到我自定义类中的 eventName 字符串。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-12-24
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多