【问题标题】:@RequestBody is always empty in Spring@RequestBody 在 Spring 中始终为空
【发布时间】:2014-11-21 14:16:24
【问题描述】:

对于下面的方法,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);
                }
            }); 

【问题讨论】:

  • 几个问题,1.) sPackage 是 null 还是什么 2.) 如果不是 null,值是什么,customerName 为空字符串 3.) 你见过 POST 请求吗,发送的数据是什么
  • sPackage 是空地图。数据像这样正确发送 {"customerName":"december,april"}

标签: java spring-mvc


【解决方案1】:

我猜spring 不知道将您的json 转换为JSONObject,最好的办法是接受与您的json 具有相似结构的POJO object

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

【讨论】:

【解决方案2】:

您确定您的 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();
}

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

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

【讨论】:

  • 这应该可以,但由于它是一个 PUT,因此按照 HTTP RFC PATCH 定义状态使用有效负载在形式上更正确。
【解决方案3】:

您可以使用此解决方法:

@RequestBody Map<String, String> json

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

您可以在此处的答案中查看扩展解释为什么会发生这种情况

@RequestBody gives empty JsonObject when making a POST Request

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多