Java 将JSON从React传递到Spring控制器
所以我尝试使用fetch发送一些数据Java 将JSON从React传递到Spring控制器,java,json,spring,reactjs,Java,Json,Spring,Reactjs,所以我尝试使用fetch发送一些数据 console.log(results.data); 结果。数据是我试图发送的内容。上面的代码在控制台中提供了以下信息: [阵列[52],阵列[52],阵列[52],阵列[52],阵列[52],阵列[52],阵列[52], 数组[52],数组[52],数组[52],数组[52],数组[52],数组[52],数组[52], 数组[52],数组[52],数组[52],数组[1]] 这让我相信,我应该期望控制器中有一个String[][] 这是react代码:
console.log(results.data);
结果。数据是我试图发送的内容。上面的代码在控制台中提供了以下信息:
[阵列[52],阵列[52],阵列[52],阵列[52],阵列[52],阵列[52],阵列[52],
数组[52],数组[52],数组[52],数组[52],数组[52],数组[52],数组[52],
数组[52],数组[52],数组[52],数组[1]]
这让我相信,我应该期望控制器中有一个String[][]
这是react代码:
fetch('/device', {
method: 'post',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify({data : results.data})
}).then(res=>res.json())
.then(res => console.log(res));
和控制器:
@RequestMapping(value= "/deviceIngestion", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String deviceIngestion (@RequestParam(value = "data[][]") String[][] data) {
return data [0][0];
}
但我在控制台中得到了这样的响应:
已解决由处理程序执行引起的异常:org.springframework.web.bind.MissingServletRequestParameterException:必需字符串[][]参数“数据[][]”不存在
我在尝试其他方法后也遇到了这个错误:
“无法读取文档:无法反序列化START\u对象标记之外的java.lang.String[][]实例。”↵ 在[来源:java.io。PushbackInputStream@2f36dd94;行:1,列:1];嵌套异常为com.fasterxml.jackson.databind.JsonMappingException:无法反序列化START_对象标记之外的java.lang.String[]实例↵ 在[来源:java.io。PushbackInputStream@2f36dd94;行:1,列:1]“
路径
:
“/deviceIngestion”
地位
:
400
时间戳
:
1513693466676
名字
我还尝试在构造函数中使用ArrayList
创建一个类,以替换我在控制器中使用的String[][]
,但没有成功
任何帮助都将不胜感激,谢谢您正在请求正文中发送数据,因此在您的控制器中,您应该尝试public@ResponseBody String deviceingstion(@RequestBody String[][]data).
尽管我自己不相信这会起作用,但值得一试或玩玩
更新您的pojo应该如下所示:
public class DataObject {
String[][] data;
public String[][] getData() {
return data;
}
public void setData(String[][] data) {
this.data = data;
}
}
public @ResponseBody String deviceIngestion (@RequestBody DataObject data)...
控制器应该是这样的:
public class DataObject {
String[][] data;
public String[][] getData() {
return data;
}
public void setData(String[][] data) {
this.data = data;
}
}
public @ResponseBody String deviceIngestion (@RequestBody DataObject data)...
body:JSON.stringify({data:results.data})
@RequestParam(value=“data[][])
1) 您正在传递数据,但控制器需要数据[][]
2) 如果您传递字符串[],那么您应该像
body:JSON.stringify(results.data)
notbody:JSON.stringify({data:results.data})
。但是,如果您必须使用原始表单,那么您可以尝试创建一个包装类,如
public class Body {
private String[][] data;
}
并在控制器中使用它,如
@RequestMapping(value= "/deviceIngestion", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String deviceIngestion (@RequestBody Body body) {
String[][] data = body.getData();
return data[0][0];
}
问题似乎是Java无法理解JSON的格式,即:
[[x,y],[a,b]
为了解决这个问题,我将JSON更改为一个对象数组
[{x:x,y:y},{x:a,y:b}]
之后,我创建了一个Java类,该类与存储在JSON数组中的对象相匹配,并将控制器更改为:
@PostMapping("/device")
public String deviceIngestion (@RequestBody List<DeviceData> devices) throws IOException{
return "success";
}
@PostMapping(“/device”)
公共字符串deviceIngestion(@RequestBody List devices)引发IOException{
返回“成功”;
}
这是我最初尝试的,它给出了我提到的第二个错误,尽管我认为这离解决方案更近了一步,感谢您发布results.data的实际JSON,而不是控制台日志,这可能会有帮助,也可能没有帮助!它包含公司敏感数据,所以没有,但它只有一个数组,其中包含16个字符串数组,每个数组中有52个字符串。如果我错了,请更正我。您发送的对象包含一个名为data的字段,其中包含16个数组,每个数组包含52个字符串对象?如果是这种情况,那么字符串[][]数据是不正确的。是的,我认为这是正确的,字符串[][]应该替换为什么?您是否尝试过不执行JSON。stringify(…)并按原样传递对象?另一个选项是显式声明consumes=MediaType.APPLICATION_JSON_UTF8_VALUE
(而不是products)在@RequestMapping中