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
相关产品推荐
相关产品推荐

