【问题标题】:Not able to send JSON data from ajax call to MVC controller无法将 JSON 数据从 ajax 调用发送到 MVC 控制器
【发布时间】:2016-07-22 13:34:48
【问题描述】:

我正在尝试从一个 HTML 表单中捕获数据并将其发送到 MVC 控制器,但下面的代码不起作用。有人可以在这里帮助我吗?

var form = JSON.stringify(jQuery('#project_form').serializeArray());
    $.ajax({
    contentType : "application/json; charset=utf-8",
    dataType : "json",
    type: "POST",
    url: "/SE/doLogin",
    data: form,
    success: function(response){
    window.location.href = response;

这是我的控制器

@RequestMapping(value = "/doLogin",method = RequestMethod.POST,consumes = "application/json",produces="text/plain")
@ResponseBody
public String sayHello(@RequestBody TestDao templateModel ){
    System.out.println("say");
    System.out.println(templateModel.getEmail());
    TestMethod t1 = new TestMethod();
            t1.getValues();
    return "newsFeed";

}

当我不保留任何参数时,它会起作用,并且 S.o.p 会打印在控制台上。我不确定@RequestBody 是否不起作用。

【问题讨论】:

  • TestDao 和你的 Json 数据是什么样子的?
  • @starcorn 感谢您指出 Json 数据格式。我认为这有问题。在 var form = JSON.stringify(jQuery('#project_form').serializeArray()); 之后我得到 Json 如下。 [{"name":"email","value":"kala"},{"name":"password","value":"kala"}] 知道如何解决这个问题吗?

标签: java json ajax spring model-view-controller


【解决方案1】:

请确保您的依赖库中有Jakson jars。如果您使用的是 spring 4,框架将自动将内容协商器作为 JSON 拾取,并会在后台查找 Jakson jar 以将 JSON 传输到服务器并从服务器获取 JSON 数据

使用 JAXB jars ,以防您需要将 XML 作为内容协商器处理。

【讨论】:

    【解决方案2】:

    使用 jquery 对象序列化扩展从表单创建 javascript 对象。然后将其作为 JSON 发送到控制器。收集自here

    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };
    

    像这样使用它

    var form = JSON.stringify(jQuery('#project_form').serializeObject());
        $.ajax({
        contentType : "application/json; charset=utf-8",
        dataType : "json",
        type: "POST",
        url: "/SE/doLogin",
        data: form,
        success: function(response){
        window.location.href = response;
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您的表单序列化只能产生键值对。因此,您实际上不能在 MVC 控制器中使用对象。

      有两种方法可以让它工作:

      • 接受名称-值映射而不是 TestDao 对象。
      • 用 Javascript 编写一个函数,将表单的名称-值转换为 TestDao 形式的对象

      【讨论】:

        【解决方案4】:

        您可以定义一个模型对象来映射您的 json 对象。

        @RequestMapping(value = "/doLogin",method = RequestMethod.POST,consumes = "application/json",produces="text/plain")
        @ResponseBody
            public String sayHello(@ModelAttribute TemplateModel templateModel ){
                System.out.println("say");
                System.out.println(templateModel.getEmail());
                TestMethod t1 = new TestMethod();
                        t1.getValues();
                return "newsFeed";
        
            }
        
        // This bean should map your json object.
        public class TemplateModel{
               private String email;
               private String values;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          • 2016-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-01
          • 1970-01-01
          相关资源
          最近更新 更多