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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:36:03