将JSON从React传递给Spring Controller

时间:2017-12-19 16:22:02

标签: java json spring reactjs

所以我尝试使用fetch发送一些数据。

console.log(results.data);

results.data是我要发送的内容。上面的代码在控制台中给出了以下内容:

  

[Array [52],Array [52],Array [52],Array [52],Array [52],Array [52],   Array [52],Array [52],Array [52],Array [52],Array [52],Array [52],   数组[52],数组[52],数组[52],数组[1]]

这让我相信我应该期待控制器中的String[][]

这是反应代码:

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];
}

但是我在控制台中得到了这个回复:

  

由Handler执行导致的已解决异常:org.springframework.web.bind.MissingServletRequestParameterException:必需String [] []参数' data [] []'不存在

我在尝试其他一些事情后也遇到了这个错误:

  

"无法读取文档:无法在[来源:java.io.PushbackInputStream@2f36dd94;中的START_OBJECT令牌中反序列化java.lang.String [] []的实例。 line:1,column:1];嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法在[来源:java.io.PushbackInputStream@2f36dd94;中的START_OBJECT令牌中反序列化java.lang.String [] []的实例。 line:1,column:1]"   路径   :   " / deviceIngestion"   状态   :   400   时间戳   :   1513693466676   名称

我还尝试在构造函数中创建一个ArrayList<String[]>的类来替换我在控制器中使用的String[][],但没有运气。

非常感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:0)

您正在请求正文中发送数据,所以在您的控制器中,您应该尝试public @ResponseBody String deviceIngestion (@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)...

答案 1 :(得分:0)

body: JSON.stringify({data : results.data})

@RequestParam(value = "data[][]")

1)您正在传递数据,但控制器需要 data [] []

2)如果你传递String [] []那么你应该发送它 body: JSON.stringify(results.data)不是body: 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];
}

答案 2 :(得分:0)

问题似乎是Java无法理解JSON所处的格式,即:  [[x,y],[a,b]] 为了解决这个问题,我将JSON更改为一个对象数组 [{x:x, y:y},{x:a,y:b}] see this

之后我创建了一个Java类,它与存储在JSON数组中的对象相匹配,并将控制器更改为以下内容:

@PostMapping("/device")
public String deviceIngestion (@RequestBody List<DeviceData> devices) throws IOException{
    return "success";        
}