有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java@RequestBody在Spring中总是空的

对于下面的方法,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) 个答案

  1. # 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. # 2 楼答案

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

    @RequestBody Map<String, String> json
    

    这样,您就可以继续使用Jackson HttpMessageConverter,并处理负载中的自定义对象

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

    @RequestBody gives empty JsonObject when making a POST Request

  3. # 3 楼答案

    您确定Spring代码中没有出现异常吗。在Spring中将JSON转换为自定义对象时,需要指定一个具有相同字段的自定义类&;格式为JSON格式。否则,Spring不知道该由谁将HTTP POST数据转换为Java对象

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

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

    把这个放在你的控制器类中:

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

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

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