Java AngularJS:使用$http.post传递复杂的json数据

Java AngularJS:使用$http.post传递复杂的json数据,java,json,angularjs,spring-mvc,Java,Json,Angularjs,Spring Mvc,我在用$http.post在angularjs中传递复杂的json对象时遇到问题。我一直收到服务器返回的400个错误请求,表示请求在语法上不正确。我相信这与数组有关,因为当我不包含它时,它通过得很好 我路过 { customer: { firstName: "John", lastName: "Doe", street: "1234 South Dr", city: "Detroit", state: "MI

我在用$http.post在angularjs中传递复杂的json对象时遇到问题。我一直收到服务器返回的400个错误请求,表示请求在语法上不正确。我相信这与数组有关,因为当我不包含它时,它通过得很好

我路过

{
    customer: {
        firstName: "John",
        lastName: "Doe",
        street: "1234 South Dr",
        city: "Detroit",
        state: "MI",
        zip: "12345",
        phone: "123-321-1234",
        email: "EMAIL@GMAIL.COM"
    },
    order: {
        orderDate: "06-16-2015",
        registerNum: "1",
        transactionNum: "7820",
        deliveryStatusID: 1,
        notes: "Hold order until July",
        items: [
            {skuID: "1234568",
             skuDescription: "Order item 1",
             qty: "4",
             itemStatusID: 1,
             itemStatusDescription: "Backorder"
             },
            {skuID: "7387491",
             skuDescription: "Order item 2",
             qty: "1",
             itemStatusID: 1,
             itemStatusDescription: "Flagged"
            }
        ]
    }
}
角服务函数

this.addOrder = function(new_order) {
    return $http.post(base + "/add", new_order);
};
Spring-MVC控制器方法

@RequestMapping(value="/add", method=RequestMethod.POST)
public void addOrder(@RequestBody CustomerOrder customerOrder) {

    System.out.println("----CUSTOMER-INFO----");
    System.out.println(customerOrder.getCustomer().getFirstName());
    System.out.println(customerOrder.getCustomer().getLastName());

    System.out.println("");
    System.out.println("----ORDER-INFO----");
    System.out.println(customerOrder.getOrder().getOrderID());
    System.out.println(customerOrder.getOrder().getOrderDate());       

}
这个问题似乎只有在我传递json中的items数组时才会出现。我已经传递了相同的json对象,但没有使用items数组,它工作得很好。json的格式与每当我使用angularjs服务方法收到订单时返回的格式相同,所以我真的不确定我的错误在哪里

如果我需要提供更多的代码,请让我知道。我感谢你为帮助我所做的一切努力

多谢各位


Jason刚刚以更好的方式格式化了Json。如果有用的话,试试这个。另外,如果可能,发布java类:

{
    "customer": {
        "firstName": "John",
        "lastName": "Doe",
        "street": "1234 South Dr",
        "city": "Detroit",
        "state": "MI",
        "zip": "12345",
        "phone": "123-321-1234",
        "email": "EMAIL@GMAIL.COM"
    },
    "order": {
        "orderDate": "06-16-2015",
        "registerNum": "1",
        "transactionNum": "7820",
        "deliveryStatusID": 1,
        "notes": "Hold order until July",
        "items": [
            {
             "skuID": "1234568",
             "skuDescription": "Order item 1",
             "qty": "4",
             "itemStatusID": 1,
             "itemStatusDescription": "Backorder"
             },
            {
             "skuID": "7387491",
             "skuDescription": "Order item 2",
             "qty": "1",
             "itemStatusID": 1,
             "itemStatusDescription": "Flagged"
            }
        ]
    }
}

只是用更好的方式格式化了Json。如果有用的话,试试这个。另外,如果可能,发布java类:

{
    "customer": {
        "firstName": "John",
        "lastName": "Doe",
        "street": "1234 South Dr",
        "city": "Detroit",
        "state": "MI",
        "zip": "12345",
        "phone": "123-321-1234",
        "email": "EMAIL@GMAIL.COM"
    },
    "order": {
        "orderDate": "06-16-2015",
        "registerNum": "1",
        "transactionNum": "7820",
        "deliveryStatusID": 1,
        "notes": "Hold order until July",
        "items": [
            {
             "skuID": "1234568",
             "skuDescription": "Order item 1",
             "qty": "4",
             "itemStatusID": 1,
             "itemStatusDescription": "Backorder"
             },
            {
             "skuID": "7387491",
             "skuDescription": "Order item 2",
             "qty": "1",
             "itemStatusID": 1,
             "itemStatusDescription": "Flagged"
            }
        ]
    }
}

在努力找出我在这个问题上的错误之后,我终于找到了解决办法。我想我会和大家分享我是如何调试和修复这个问题的,以防其他人和我有类似的情况

在尝试了各种可能的方式将数据以angular方式发送到服务器并不断收到相同的HTTP 400错误后,我决定将json作为字符串发送,并在spring mvc控制器中接受json作为字符串,如下所示

角度服务方法:

this.addOrder = function(new_order) {
    return $http.post(base + "/add", angular.toJson(new_order));
};
弹簧控制器

@RequestMapping(value="/add", method=RequestMethod.POST, consumes="application/json")
public void addOrder(@RequestBody String json) {

}
从这里,我只需获取传入的json,并使用Jackson ObjectMapper将json字符串转换为我的POJO,如下所示

将json字符串映射到pojo

@RequestMapping(value="/add", method=RequestMethod.POST, consumes="application/json")
public void addOrder(@RequestBody String json) {

    ObjectMapper mapper = new ObjectMapper();

    try {

        CustomerOrder order = mapper.readValue(json, CustomerOrder.class);
        System.out.println(order.getCustomer().getFirstName() + " " + order.getCustomer().getLastName());

    } catch (JsonGenerationException e) {

        e.printStackTrace();

    } catch (JsonMappingException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    }
}
执行此操作并运行代码后,在尝试将Items json绑定到Order类中的列表时,我会在Items类中的字段上出现无法识别的属性异常。这只是json方面的一个简单错误,我完全没有注意到。在纠正了这个错误之后,jackson正确地映射了所有内容,我不再收到这个HTTP 400错误,因为请求在语法上是不正确的


另一件需要注意的事情是,如果您使用JSON.stringify以字符串的形式传递对象,那么您可能会在JSON对象的hashKey字段上遇到相同的异常。angular使用哈希键监视更改。我相信您可以使用jackson注释来忽略未知字段,或者您可以简单地使用angular.toJson,它将为您删除所有hasKey/值,这就是我所做的。

在努力找到这个问题中的错误之后,我终于找到了解决方案。我想我会和大家分享我是如何调试和修复这个问题的,以防其他人和我有类似的情况

在尝试了各种可能的方式将数据以angular方式发送到服务器并不断收到相同的HTTP 400错误后,我决定将json作为字符串发送,并在spring mvc控制器中接受json作为字符串,如下所示

角度服务方法:

this.addOrder = function(new_order) {
    return $http.post(base + "/add", angular.toJson(new_order));
};
弹簧控制器

@RequestMapping(value="/add", method=RequestMethod.POST, consumes="application/json")
public void addOrder(@RequestBody String json) {

}
从这里,我只需获取传入的json,并使用Jackson ObjectMapper将json字符串转换为我的POJO,如下所示

将json字符串映射到pojo

@RequestMapping(value="/add", method=RequestMethod.POST, consumes="application/json")
public void addOrder(@RequestBody String json) {

    ObjectMapper mapper = new ObjectMapper();

    try {

        CustomerOrder order = mapper.readValue(json, CustomerOrder.class);
        System.out.println(order.getCustomer().getFirstName() + " " + order.getCustomer().getLastName());

    } catch (JsonGenerationException e) {

        e.printStackTrace();

    } catch (JsonMappingException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    }
}
执行此操作并运行代码后,在尝试将Items json绑定到Order类中的列表时,我会在Items类中的字段上出现无法识别的属性异常。这只是json方面的一个简单错误,我完全没有注意到。在纠正了这个错误之后,jackson正确地映射了所有内容,我不再收到这个HTTP 400错误,因为请求在语法上是不正确的


另一件需要注意的事情是,如果您使用JSON.stringify以字符串的形式传递对象,那么您可能会在JSON对象的hashKey字段上遇到相同的异常。angular使用哈希键监视更改。我相信你可以使用jackson注释来忽略未知字段,或者你可以简单地使用angular.toJson,它将为你删除所有hasKey/值,这就是我所做的。

是完整的json对象吗?是的,我忘了复制开头{和结尾}。在这篇文章中,我将编辑它,尝试将你的键放入
“”
。当我这样做时,也包括打开和关闭
{}
时,它在jasonlint.com上验证得很好。我用“”中的键尝试了它,但仍然得到相同的错误。确切的错误消息是什么?与文件结构相关的json对象存储在哪里?这是完整的json对象吗?是的,我忘记在打开时复制了{和closing}在这篇文章中,我也会编辑它,把你的钥匙放到
中。当我这样做时,也包括打开和关闭
{}
时,它在jasonlint.com上验证得很好。我用钥匙试过了“”但仍然会得到相同的错误。确切的错误消息是什么?与文件结构相关的json对象存储在哪里?经过几个小时的努力,终于找到了这篇文章。干得好。经过几个小时的努力,终于找到了这篇文章。干得好。