【问题标题】:Spring is flattening 2D JSON array to 1D String arraySpring 正在将 2D JSON 数组展平为 1D 字符串数组
【发布时间】:2020-11-05 02:20:58
【问题描述】:

我正在使用 AJAX 将表单数据发布到 Spring 控制器。我将一个二维数组附加到我的表单数据中,例如data.push({name: "currentRoles", value: optionsArray});,并尝试将其作为Map<String, String> 接收,但是我收到错误Resolved [org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String[]'。由于某种原因,该阵列似乎被扁平化为一维阵列。数组的格式为:{name: "currentRoles", value: Array(2)}

完整的 JS:

var roles = $(".selectpicker.role");
            var optionsArray = [];
            $.each(roles, function(index, item){
                var testArray = [];
               $.each($(roles[index]).find("option:selected"), function(index2, item2){
                  testArray.push($(item2).val());
               });
               optionsArray.push(testArray);"name":"currentRoles"}).val(optionsArray);
            });
            data.push({name: "currentRoles", value: optionsArray});

编辑:尝试将 Map<String, String> 更改为 Map<String, Object>,没有任何区别

我的控制器:

@PostMapping(value="/AdminEditGroup")
    public ModelAndView editGroup(@RequestParam String groupName, @RequestParam (required = false) String[] currentMembers,
                          @RequestParam (required = false) String currentFramework, @RequestParam (required = false) RoleWrapper currentRoles,
                                  @RequestParam String originalName, Model model){}

角色包装器:

public class RoleWrapper {

    private Map<String, Object> roleWrapper = new HashMap<String, Object>();

    public Map<String, Object> getRoleWrapper() {
        return roleWrapper;
    }

    public void setRoleWrapper(Map<String, Object> roleWrapper) {
        this.roleWrapper = roleWrapper;
    }
}

编辑:作为 Andreas 答案的扩展,我已将控制器方法更改为以下内容:

@PostMapping(value="/AdminEditGroup", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
        public ModelAndView editGroup(@RequestParam MultiValueMap request, Model model){
        logger.info(request.toString());
}

这反过来产生输出:currentRoles=[Student, Teacher, Student, Student,Teacher,Student] 用于 JSON

{
  "name": "currentRoles",
  "value": [
    ["Student", "Teacher"],
    ["Student"]
  ]
}

信息被复制并再次展平为一维数组。我怀疑这与 Spring 如何转换表单数据有关。

【问题讨论】:

  • 您为什么认为二维数组或任何与此相关的数组会映射到String?如果您需要 Java+Spring 代码方面的帮助,请显示代码,至少显示有问题的处理程序方法。
  • 当 ajax 将一个数组传递给 spring 时,它不是字符串吗?我所有的 1d JSON 数组都映射到 String[] 数组
  • 好的,我再重复一遍:显示代码。我们需要看看您是如何定义 Spring 处理程序方法的,所以编辑问题并向我们展示代码!!
  • 老实说,我不知道 Spring 处理程序代码是什么意思,我已经添加了包装器对象和控制器
  • 我写评论时不在那里。

标签: javascript java arrays json spring


【解决方案1】:

您发送的 JSON 可能如下所示:

{
  "name": "currentRoles",
  "value": [
    ["val1", "val2", "val3"],
    ["val4", "val5"],
    ["val6", "val7", "val8", "val9"]
  ]
}

要接收这种有效载荷,您需要将方法定义为:

@PostMapping(value="/AdminEditGroup", consumes="application/json")
public ModelAndView editGroup(@RequestBody Map<String, Object> request, Model model) {
    String name = (String) request.get("name");
    List<List<String>> = (List) request.get("value");
    // code
}

当然,除非您将问题代码中显示的data 包装为更复杂的内容,但由于您尚未分享,我们无法提供帮助。

【讨论】:

  • 不幸的是,这似乎只是复制了数组信息并将其压缩成一维数组
【解决方案2】:

您应该使用Map&lt;String, Object&gt; 这应该可以正常工作。您的 value 是一个数组,但您试图将其放入 String 中,但无法完成。

【讨论】:

  • 这好像没什么区别,错误还是一样
猜你喜欢
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2022-11-18
  • 2017-07-29
  • 2020-01-20
  • 1970-01-01
  • 2017-04-04
相关资源
最近更新 更多