You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot后端接收含对象列表的JSON请求数据为空问题求助

问题分析与解决方案

你的问题源于两个核心问题:请求体数据类型与后端实体类不匹配,以及实体类的getter/setter命名与字段名不一致,导致Jackson无法正确完成JSON反序列化,最终dataFields列表为空。

1. 创建匹配请求体的实体类

客户端发送的dataFields是对象列表(每个对象包含type、label、name、value等字段),但你后端用List<String>接收,类型完全不匹配。需要先定义对应的数据实体类:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

// 忽略JSON中不存在的字段,适配不同结构的对象
@JsonIgnoreProperties(ignoreUnknown = true)
public class DataField {
    private String type;
    private String label;
    private String name;
    private String value;

    // 生成标准getter和setter方法
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

2. 修改ManageRequest实体类

将dataFields的类型改为List<DataField>,同时修正getter/setter的命名(必须和字段名dataFields对应,否则Jackson无法识别):

import java.util.List;

public class ManageRequest {
    private String accountId;
    private String command;
    private String transactionId;
    // 修改为List<DataField>类型
    private List<DataField> dataFields;

    public String getAccountId() {
        return accountId;
    }

    public void setAccountId(String accountId) {
        this.accountId = accountId;
    }

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }

    public String getTransactionId() {
        return transactionId;
    }

    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }

    // 修正getter/setter名称,与字段名dataFields保持一致
    public List<DataField> getDataFields() {
        return dataFields;
    }

    public void setDataFields(List<DataField> dataFields) {
        this.dataFields = dataFields;
    }
}

3. 后端接口处理

现在接口可以正常接收dataFields列表,你可以提取内容进行后续处理:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@PostMapping(
        consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},
        produces = {MediaType.APPLICATION_JSON_VALUE})
public void postBody(@RequestBody ManageRequest manageRequest) {
    List<DataField> dataFields = manageRequest.getDataFields();
    
    // 示例1:直接复制原列表用于后续请求
    List<DataField> newDataList = new ArrayList<>(dataFields);
    
    // 示例2:筛选特定类型的字段(比如图片类型)
    List<DataField> imageFields = dataFields.stream()
            .filter(field -> "_image_".equals(field.getType()))
            .collect(Collectors.toList());
            
    // 后续POST请求逻辑...
}

为什么之前为空?

  1. 类型不匹配:客户端发送的是对象数组,后端用List<String>接收,Jackson无法将对象转换为字符串,反序列化失败导致列表为空。
  2. 命名不匹配:实体类字段名为dataFields,但setter方法是setDataFieldList,Jackson找不到对应的注入方法,无法填充数据。

内容的提问来源于stack exchange,提问作者letsgetraw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:05:28