@RequestBody在Spring中总是空的

时间:2014-11-21 14:16:25

标签: java spring-mvc

对于下面的方法,JSONObject总是为空。

 @RequestMapping(value = "/package/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public SPackage updatePackage(@PathVariable String id, @RequestBody JSONObject   
 sPackage) {
}

我的ajax是这样的。我的方法是将对象作为服务器端的空映射

   var jsonObject= {"customerName":$('#customerName').val()}
     var jsonData = JSON.stringify(jsonObject);  
            $.ajax({ 
                type: "PUT",
                url: "http://localhost:8081/someproj/package/" + $('#id').val(),
                dataType: "json",
                data: jsonData,
                async: false,                                               
                contentType: "application/json; charset=utf-8",
                beforeSend : function() { 
                    openModal();
                },
                success: function(data) { 
                    closeModal();
                $('#success').show();
                 console.log(data);
                }
            }); 

3 个答案:

答案 0 :(得分:1)

我猜spring无法将您的json转换为JSONObject,最好的方法是接受与您的结构类似的POJO object json

@RequestMapping(value = "/package/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public SPackage updatePackage(@PathVariable String id, @RequestBody YourJsonPOJO   
 sPackage) {
}

答案 1 :(得分:0)

您确定Spring代码中没有异常。在Spring中从JSON转换为自定义对象时,您需要指定具有相同字段和自定义的自定义类。格式为JSON进来。否则,Spring不知道将HTTP POST数据转换为Java对象的人。

在您的情况下,您可以像这样定义POJO:

public class MyRequestObj {
    private String customerName;
    // add more fields for any other keys from JSON
}

将它放在Controller类中:

@RequestMapping(value = "/package/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public SPackage updatePackage(@PathVariable String id, @RequestBody MyRequestObj   
 myRequestObj) {
    String customerName = myRequestObj.getCustomerName();
}

当然,如果您只想将客户名称作为String传递给Controller,那么您也可以将其作为查询字符串传递(追加?customerName = someCustomer),然后您可以在Spring中将其检索为:

@RequestMapping(value = "/package/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public SPackage updatePackage(@PathVariable String id, @RequestParam("customerName") String customerName) {
} 

答案 2 :(得分:0)

您可以使用以下解决方法:

@RequestBody Map<String, String> json

这样,您就可以继续使用Jackson HttpMessageConverter并在有效负载中使用自定义对象。

您可以在此处的答案中查看扩展解释的原因

@RequestBody gives empty JsonObject when making a POST Request