【问题标题】:Passing JSON from React to Spring Controller将 JSON 从 React 传递到 Spring 控制器
【发布时间】:2017-12-19 16:22:01
【问题描述】:

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

console.log(results.data);

results.data 是我要发送的内容。上面的代码在控制台中为我提供了以下信息:

[数组[52],数组[52],数组[52],数组[52],数组[52],数组[52], 数组[52]、数组[52]、数组[52]、数组[52]、数组[52]、数组[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: Required String[][] parameter 'data[][]' is not present

在尝试了其他一些方法后,我也遇到了这个错误:

“无法读取文档:无法从 [Source: java.io.PushbackInputStream@2f36dd94; line: 1, column: 1] 的 START_OBJECT token↵ 中反序列化 java.lang.String[][] 的实例;嵌套例外是 com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize of java.lang.String[][] out of START_OBJECT token↵ at [Source: java.io.PushbackInputStream@2f36dd94; line: 1, column: 1 ]" 小路 : “/设备摄取” 地位 : 400 时间戳 : 1513693466676 名称

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

任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: java json spring reactjs


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      1) 您正在传递 data 但控制器需要 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];
      }
      

      【讨论】:

      • 您是否尝试过不执行 JSON.stringify(...) 而只是按原样传递对象?
      • 我会尝试的另一个选项是在 @RequestMapping 中显式声明 consumes = MediaType.APPLICATION_JSON_UTF8_VALUE(而不是产生)
      【解决方案3】:

      您正在请求正文中发送数据,因此在您的控制器中您应该尝试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)...
      

      【讨论】:

      • 这是我最初尝试的,它给出了我提到的第二个错误,虽然我认为它离解决方案更近了一步,谢谢
      • 您能否发布 results.data 的实际 JSON 而不是控制台日志,这可能有帮助,也可能没有帮助!
      • 它包含公司敏感数据,所以没有,但它只有一个数组,里面有 16 个字符串数组,每个数组里面有 52 个字符串
      • 所以,如果我错了,请纠正我,您发送的对象是一个名为 data 的字段,其中包含一个由 16 个其他数组组成的数组,每个数组包含 52 个 String 对象?如果是这种情况,则 String[][] 数据不正确。
      • 是的,我相信是对的,String[][] 应该换成什么?
      猜你喜欢
      • 2017-03-16
      • 2013-08-01
      • 1970-01-01
      • 2013-12-13
      • 2013-03-19
      • 1970-01-01
      • 2017-03-06
      • 2017-04-18
      • 2018-11-17
      相关资源
      最近更新 更多