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

HTTP请求传递嵌套DTO时出现JSON错误及DispatcherServlet异常

解决前端传递嵌套DTO对象时的Spring MVC请求处理错误

嘿,我之前在处理Spring MVC嵌套DTO的JSON请求时也踩过类似的坑,这个错误通常是JSON解析或者对象映射环节出了问题,咱们一步步来排查解决:

1. 确保JSON字段与DTO属性完全匹配

Spring的Jackson消息转换器默认是严格匹配字段名的(包括大小写),所以前端传的JSON键必须和DTO里的属性名完全一致。

给你一个符合你DTO结构的正确JSON示例:

{
  "id_disciplina": 1,
  "st_nome": "高等数学",
  "ls_alunos": [
    {
      "id_aluno": 1001,
      "st_nome_aluno": "Maria Silva"
    },
    {
      "id_aluno": 1002,
      "st_nome_aluno": "João Souza"
    }
  ]
}

如果前端习惯用驼峰命名(比如lsAlunos),但DTO里是下划线风格(ls_alunos),可以在DTO属性上添加@JsonProperty注解明确映射关系:

@JsonProperty("ls_alunos")
private ArrayList<AlunoListDTO> lsAlunos;

2. 给DTO类添加无参构造器和完整的getter/setter

Jackson需要通过无参构造器来实例化DTO对象,同时所有属性都要有对应的getter和setter方法才能完成赋值。比如你的DisciplinaDTO应该这样写:

public class DisciplinaDTO {
    private Long id_disciplina;
    private String st_nome;
    private ArrayList<AlunoListDTO> ls_alunos;

    // 必须要有无参构造器,Jackson依赖它创建对象
    public DisciplinaDTO() {}

    // 所有属性的getter和setter
    public Long getId_disciplina() {
        return id_disciplina;
    }

    public void setId_disciplina(Long id_disciplina) {
        this.id_disciplina = id_disciplina;
    }

    public String getSt_nome() {
        return st_nome;
    }

    public void setSt_nome(String st_nome) {
        this.st_nome = st_nome;
    }

    public ArrayList<AlunoListDTO> getLs_alunos() {
        return ls_alunos;
    }

    public void setLs_alunos(ArrayList<AlunoListDTO> ls_alunos) {
        this.ls_alunos = ls_alunos;
    }
}

AlunoListDTO也需要同样的配置,不能省略无参构造器和getter/setter。

3. 确认前端请求头设置正确

前端发送POST请求时,必须把Content-Type设置为application/json,否则Spring会把请求体当作普通表单数据处理,根本无法解析成JSON对象。

举个axios的示例:

const disciplinaData = {
  id_disciplina: 1,
  st_nome: "高等数学",
  ls_alunos: [
    { id_aluno: 1001, st_nome_aluno: "Maria Silva" },
    { id_aluno: 1002, st_nome_aluno: "João Souza" }
  ]
};

axios.post('/your-api-endpoint', disciplinaData, {
  headers: {
    'Content-Type': 'application/json'
  }
})

4. 检查Jackson依赖是否正常引入

如果是Spring Boot项目,默认已经集成了Jackson,不用额外配置;但如果是普通的Spring MVC项目,需要确保在依赖管理里添加了Jackson的核心包:

Maven示例(pom.xml):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版 -->
</dependency>

5. 查看完整的异常栈信息

你现在只贴了错误的开头,建议把nested exception is ...后面的完整异常信息找出来,这能直接定位问题:

  • 如果是InvalidFormatException:大概率是字段类型不匹配(比如前端传了字符串给Long类型的id字段)
  • 如果是MismatchedInputException:通常是JSON结构和DTO不匹配(比如少了必填字段,或者数组格式错误)
  • 如果是NoSuchMethodException:就是你漏了无参构造器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:54:30