使用Postman提交JSON任务数据时插入数据库值为null的问题排查
POST接口插入MySQL数据为null的问题排查
问题描述
通过Postman以JSON请求体提交任务数据,插入MySQL后数据为null。项目中GET、DELETE等接口正常工作,仅POST添加任务接口出现异常。
相关代码
RestController代码
package com.training.Taskdemo.rest; import com.training.Taskdemo.entity.Task; import com.training.Taskdemo.service.TaskService; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/") public class TaskRestController { private TaskService thetask; public TaskRestController(TaskService taskDetail) { thetask = taskDetail; } @GetMapping("/tasks") public List<Task> findAll() { return thetask.findAll(); } @PostMapping("/addTask") public Task addTask(@RequestBody Task task) { task.setId(0); Task taskDetail = thetask.add(task); return taskDetail; } @GetMapping("/tasks/{taskId}") public Task getTask(@PathVariable int taskId) { Task fetchTask = thetask.findById(taskId); if(fetchTask == null) { throw new RuntimeException("Task id not found"); } return fetchTask; } @DeleteMapping("/tasks/{taskId}") public String deleteTask(@PathVariable int taskId) { Task taskDetail = thetask.findById(taskId); if(taskDetail == null) { throw new RuntimeException("Task id not found"); } thetask.delete(taskId); return "Deleted task id "+ taskId; } }
TaskDAO代码
package com.training.Taskdemo.dao; import com.training.Taskdemo.entity.Task; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class TaskDAOImpl implements TaskDAO { private EntityManager theEntityManager; @Autowired public TaskDAOImpl(EntityManager entityManager){ theEntityManager = entityManager; } @Override public List<Task> findAll() { TypedQuery<Task> theQuery = theEntityManager.createQuery("From Task",Task.class); List<Task>taskDetail = theQuery.getResultList(); return taskDetail; } @Override public Task findById(int theId) { Task taskDetail = theEntityManager.find(Task.class, theId); return taskDetail; } @Override public Task add(Task theTask) { System.out.println(theTask); Task addTask = theEntityManager.merge(theTask); return addTask; } @Override public void delete(int theId) { Task taskdelete = theEntityManager.find(Task.class, theId); theEntityManager.remove(taskdelete); } }
TaskService代码
package com.training.Taskdemo.service; import com.training.Taskdemo.dao.TaskDAO; import com.training.Taskdemo.entity.Task; import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class TaskServiceImpl implements TaskService { private TaskDAO taskRepository; @Autowired public TaskServiceImpl(TaskDAO thetask){ taskRepository = thetask; } @Override public List<Task> findAll() { return taskRepository.findAll(); } @Override public Task findById(int theId) { return taskRepository.findById(theId); } @Transactional @Override public Task add(Task task) { return taskRepository.add(task); } @Transactional @Override public void delete(int theId) { taskRepository.delete(theId); } }
Task实体类代码
package com.training.Taskdemo.entity; import jakarta.persistence.*; import org.springframework.data.relational.core.mapping.Table; @Entity @Table(name="task") public class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="task_id") private int id; @Column(name="Task_name") private String name; @Column(name="task_priority") private String priority; public Task(){ } public Task(String name, String priority) { this.name = name; this.priority = priority; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPriority() { return priority; } public void setPriority(String priority) { this.priority = priority; } @Override public String toString() { return "Task{" + "id=" + id + ", name='" + name + '\'' + ", priority='" + priority + '\'' + '}'; } }
排查与解决方案
1. 实体类注解冲突
Task实体类同时引入了JPA的@Table和Spring Data Relational的@Table,导致映射逻辑混乱。删除Spring Data Relational的Table注解及对应导入:
// 移除该行导入 // import org.springframework.data.relational.core.mapping.Table; @Entity @Table(name="task") // 仅保留JPA的@Table注解 public class Task { // ... 其他代码不变 }
2. JSON字段与实体属性匹配
确保Postman发送的JSON字段名与实体类属性名完全一致:
- 正确的JSON请求体示例:
{ "name": "测试任务", "priority": "高" }
若JSON字段采用首字母大写格式(如Name),可通过@JsonProperty注解指定映射关系:
@JsonProperty("Name") @Column(name="Task_name") private String name;
3. 检查请求头Content-Type
确认Postman请求头中Content-Type设置为application/json,否则Spring无法正确解析JSON请求体,导致@RequestBody接收的Task对象属性全为null。
4. 日志验证请求体解析
在addTask方法中打印接收的Task对象,快速定位是否为请求体解析问题:
@PostMapping("/addTask") public Task addTask(@RequestBody Task task) { System.out.println("接收的Task对象: " + task); // 打印日志验证 task.setId(0); Task taskDetail = thetask.add(task); return taskDetail; }
若打印的对象中name和priority为null,说明是请求体解析问题;若有值,再排查DAO层的数据库操作逻辑。
5. 数据库字段映射验证
确认实体类@Column注解的name值与MySQL表task的字段名完全一致:
task_id对应实体类id;Task_name对应name;task_priority对应priority。
字段名不匹配会导致数据插入时无法映射,最终存入null。
内容的提问来源于stack exchange,提问作者Sourav
相关产品推荐
相关产品推荐

