前端传json数据给后端使用pojo类接收 属性值为null解决思路

1问题分析:

(1)第一种可能:前端字段与后端属性名对应不上
(2)第二种可能;pojo类没有Getter和Setter方法来读取和写入属性值
(3)第三种可能:没有使用@RequestBody注解或者@RequestParam注解

2解决方法:

(1)第一种可能 解决方法: 检查自己的json数据和pojo类属性名

说一下我当时遇到的问题:我前端json对象里面又嵌套了一个json对象给后端导致我所有的属性值为null,所以我将嵌套的json对象删除就好了

pojo类:

java 复制代码
/**
 * 新增课程Dto
 */
@Data
@ApiModel
public class AddCourseDto {

    @NotEmpty(message = "添加课程名称不能为空",groups={ValidationGroups.Inster.class})
    @NotEmpty(message = "修改课程名称不能为空",groups={ValidationGroups.Update.class})
    @ApiModelProperty(value = "课程名称", required = true)
    private String name;

    @NotEmpty(message = "适用人群不能为空")
    @Size(message = "适用人群内容过少",min = 10)
    @ApiModelProperty(value = "适用人群", required = true)
    private String users;

    @ApiModelProperty(value = "课程标签")
    private String tags;

    @NotEmpty(message = "课程分类不能为空")
    @ApiModelProperty(value = "大分类", required = true)
    private String mt;

    @NotEmpty(message = "课程分类不能为空")
    @ApiModelProperty(value = "小分类", required = true)
    private String st;

    @NotEmpty(message = "课程等级不能为空")
    @ApiModelProperty(value = "课程等级", required = true)
    private String grade;

    @ApiModelProperty(value = "教学模式(普通,录播,直播等)", required = true)
    private String teachMode;

    @ApiModelProperty(value = "课程介绍")
    private String description;

    @ApiModelProperty(value = "课程图片", required = true)
    private String pic;

    @NotEmpty(message = "收费规则不能为空")
    @ApiModelProperty(value = "收费规则,对应数据字典", required = true)
    private String charge;

    @ApiModelProperty(value = "价格")
    private Float price;
    @ApiModelProperty(value = "原价")
    private Float originalPrice;


    @ApiModelProperty(value = "qq")
    private String qq;

    @ApiModelProperty(value = "微信")
    private String wechat;
    @ApiModelProperty(value = "电话")
    private String phone;

    @ApiModelProperty(value = "有效期")
    private Integer validDays;

}

/**
 * 修改课程Dto
 */
@ApiModel
@Data
//解决实现EqualsAndHashCode不会考虑父类的属性
@EqualsAndHashCode(callSuper = true)
public class EditCourseDto extends AddCourseDto{
    @ApiModelProperty(value = "课程id",required = true)
    private Long id; //课程id
}

前端Json代码(错误实例):

javascript 复制代码
{
    "editCourseDto": {
        "id": 861333945463,
        "name":"洛克王国攻略",
        "users":"00后专属buffer,童年回忆zzz",
        "tags":"游戏攻略",
        "mt":"游戏",
        "st":"页游",
        "grade":"1",
        "teachMode":"录播",
        "description":"洛克王国是一款转型小学生开发的游侠,内容简单好操作就是升级慢耗费时间。",
        "pic":"113802717",
        "charge":"55/1h",
        "price":"100",
        "originalPrice":"170",
        "qq":"111111111",
        "wechat":"1111111111",
        "phone":"11111169182",
        "validDays":"20221028",
    }
}

改正前端代码:

javascript 复制代码
{
    "id": 861333945463,
    "name":"洛克王国攻略",
    "users":"00后专属buffer,童年回忆zzz",
    "tags":"游戏攻略",
    "mt":"游戏",
    "st":"页游",
    "grade":"1",
    "teachMode":"录播",
    "description":"洛克王国是一款转型小学生开发的游侠,内容简单好操作就是升级慢耗费时间。",
    "pic":"113802717",
    "charge":"55/1h",
    "price":"100",
    "originalPrice":"170",
    "qq":"111111111",
    "wechat":"1111111111",
    "phone":"11111169182",
    "validDays":"20221028",
}
(2)第二中可能 解决方法: 重写Getter和Setter方法或者使用Lombok的@Data注解

这里分析一下为啥需要重写Getter和Setter方法,

在Spring Boot项目中,使用POJO类来接收前端传递的JSON数据是因为Spring Boot内置了Jackson库,它可以将JSON数据自动地转换为Java对象。

Jackson库提供了`ObjectMapper`类,它可以将JSON数据反序列化为POJO对象。当前端向后端发送JSON数据时,Spring Boot会自动地使用Jackson库将JSON数据转换为POJO对象,并将其作为方法参数传递给相应的Controller方法。

为了正确地将JSON数据转换为POJO对象,需要确保POJO类中的字段名称与JSON数据中的字段名称匹配。Jackson库使用Java对象的Getter和Setter方法来读取和写入属性值,因此POJO类中的字段需要具有相应的Getter和Setter方法

(3)第三种可能 解决方法:

当前端传过来的是json数据需要在Controller方法中加上@RequestBody注解,当使用的是url传参并使用了集合类型必须加上@RequestParam注解

java 复制代码
    //传递的参数为json数据
    @PutMapping
    public CourseBaseInfoDto updateCourseBase(@RequestBody EditCourseDto editCourseDto){
        Long companyId = 2138912L; //公司id
        return courseBaseInfoService.updateCourseBase(companyId,editCourseDto);
    }

    //传递的参数为集合且为url传参
    @GetMapping
    public CourseBaseInfoDto updateCourseBase(@RequestParam List<String> list){
        Long companyId = 2138912L; //公司id
        return courseBaseInfoService.updateCourseBase(companyId,editCourseDto);
    }
相关推荐
蜗牛^^O^38 分钟前
Docker和K8S
java·docker·kubernetes
从心归零1 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe3 小时前
分布式系统实战经验
java·分布式
是梦终空3 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss3 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸4 小时前
flink doris批量sink
java·前端·flink
Monodye4 小时前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构
一丝晨光4 小时前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符